synchronized 和 volatile 的區別是什麼?

一、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線程不阻塞。

 

天天一道面試題,持續更新@目錄

相關文章
相關標籤/搜索