1.原始構成
synchronized是關鍵字屬於jvm層面;
monitorenter和monitorexit(底層是通過mointor物件來完成,其實wait/notify等方法也依賴monitor物件,所以只有在同 步**塊方法中才能呼叫wait/notify等方法)
lock是具體的類時api層面鎖;
2.使用方法
synchronized不需要使用者手動釋放鎖,當synchronized**執行完成後系統會自動讓執行緒釋放對鎖的占用;
reentrantlock則需要手動去釋放鎖,如果沒有手動釋放鎖就可能導致出現死鎖現象;
需要lock()和unlock()方法配合try/finally語句塊來完成
3.等待是否可中斷
synchronized不可中斷,除非丟擲異常或者正常執行完成
reentrantlock可中斷,1.設定超時時間trylock(long timeout,timeunit unit),2.lockinterruptibly()放**塊中,呼叫 interrup()方法
4.加鎖是否公平
synchronized非公平鎖
reentrantlock兩者都可以,預設非公平鎖,建構函式傳true即為公平鎖
5.鎖繫結多個條件的condition
synchronized沒有,要麼只喚醒乙個,要麼所有都喚醒,不能精準喚醒
reentrantlock通過condition可以實現精準喚醒某個執行緒
lockInterruptibly和lock的區別
size medium lock 拿不到lock就不罷休,不然執行緒就一直block。lockinterruptibly會優先響應執行緒中斷,處理響應的方式是丟擲interruptedexception。size 可以從原始碼看出來的 private void doacquireinterrupti...
synchronized和volatile的區別?
一旦乙個共享變數 類的成員變數 類的靜態成員變數 被volatile修飾之後,那麼就具備了兩層語義 1 保證了不同執行緒對這個變數進行操作時的可見性,即乙個執行緒修改了某個變數的值,這新值對其他執行緒來說是 立即可見的。2 禁止進行指令重排序。volatile本質是在告訴jvm當前變數在暫存器 工作...
synchronized和volatile的區別
volatile關鍵字的本質是告訴jvm,該變數在暫存器中的值是不確定的,需要在主存中讀取,而synchronized關鍵字是鎖住當前變數,只有當前執行緒可以訪問,其他執行緒等待。volatile關鍵字的作用 保證變數的可見性和防止指令重排序。1.volatile只能作用於變數,而synchroni...