一、notify() 和 notifyAll() 有什麼區別?面試
先解釋兩個概念:多線程
等待池:假設一個線程調用了wait方法,線程就會釋放該對象的鎖,進入到該對象的等待池.net
鎖池:只有得到了對象的鎖,線程纔會執行對象的synchronizeed代碼,對象的鎖每次只有一個線程能夠得到,其它線程只能在鎖池中等待線程
notify()方法隨機喚醒對象等待池中的一個線程,進入鎖池。對象
notifyAll()喚醒對象的等待池中的全部線程,進入鎖池。blog
二、execute()和submit()有什麼區別?接口
線程任務分兩類,一類是實現了runnable接口,一類是實現了callable接口。隊列
execute(Runnable x)沒有返回值,能夠執行任務,但沒法判斷任務是否成功完成,實現runnable接口資源
submit(Runnable x)返回一個future。能夠用這個future來判斷任務是否成功完成,實現Callable接口get
三、sleep() 和 wait() 有什麼區別?
①sleep()是thread類的靜態本地方法
wait()是Obejct類的成員本地方法
②sleep()方法能夠在任何地方使用
wait()方法只能在同步方法或同步代碼塊中使用
③sleep()會休眠當前線程指定時間,釋放CPU資源,不釋放對象鎖,休眠時間到自動甦醒繼續執行
wait()方法放棄持有的對象鎖,進入等待隊列,當該對象被調動notify()或notifyAll()方法後纔有機會競爭獲取對象鎖,進行運行狀態
④均需捕獲interruptedException異常
四、synchronized 和 volatile 的區別是什麼?
做用:
synchronized表示只有一個線程能夠獲取做用對象的鎖,執行代碼,阻塞其它線程。
volatile表示變量在CPU寄存器中是不肯定的,必須從主存中讀取,保證多線程環境下變量的可見性和有序性。
區別:
synchronized能夠做用於方法、變量;volatile只能做用於變量。
synchronized能夠保證線程間的有序性、原子性和可見性;volatile紙包裝了可見性和有序性,沒法保證原子性。
synchronized線程阻塞,volatile線程不阻塞。