1. 程式人生 > >編寫高質量程式碼改善Java程式的151個建議

編寫高質量程式碼改善Java程式的151個建議

Lock類(顯式鎖)synchronized關鍵字(內部鎖)用在程式碼塊的併發性和記憶體上時的語義是一樣的,都是保持程式碼塊同時只有一個執行緒具有執行權。顯式鎖的鎖定和釋放必須在一個try...finally塊中,這是為了確保即使出現執行期異常也能正常釋放鎖,保證其他執行緒能夠順利執行。Lock鎖為什麼不出現互斥情況,所有執行緒都是同時執行的?原因:這是因為對於同步資源來說,顯式鎖是物件級別的鎖,而內部鎖是類級別的鎖,也就是說Lock鎖是跟隨物件的synchronized鎖是跟隨類的,更簡單地說把Lock定義為多執行緒類的私有屬性是起不到資源互斥作用的,除非是把Lock定義為所有執行緒共享變數。除了以上不同點之外,還有以下4點不同:1、Lock支援更細粒度的鎖控制
,假設讀寫鎖分離,寫操作時不允許有讀寫操作存在,而讀操作時讀寫可以併發執行,這一點內部鎖很難實現;2、Lock是無阻塞鎖,synchronized是阻塞鎖,執行緒A持有鎖,執行緒B也期望獲得鎖時,如果為Lock,則B執行緒為等待狀態,如果為synchronized,則為阻塞狀態;3、Lock可實現公平鎖,synchronized只能是非公平鎖什麼叫做非公平鎖?當一個執行緒A持有鎖,而執行緒B、C處於阻塞(或等待)狀態時,若執行緒A釋放鎖。JVM將從執行緒B、C中隨機選擇一個執行緒持有鎖並使其獲得執行權,這叫做非公平鎖(因為它拋棄了先來後到的順序);若JVM選擇了等待時間最長的一個執行緒持有鎖,則為公平鎖。需要注意的是,即使是公平鎖,JVM也無法準確做到“公平”,在程式中不能以此作為精確計算。顯式鎖預設是非公平鎖,但可以在建構函式中加入引數true來宣告出公平鎖;4、Lock是程式碼級的,synchronized是JVM級的
,Lock是通過編碼實現的,synchronized是在執行期由JVM解釋的,相對來說synchronized的優化可能性更高,畢竟是在最核心不為支援的,Lock的優化需要使用者自行考慮。相對來說,顯式鎖使用起來更加便利和強大,在實際開發中選擇哪種型別的鎖就需要根據實際情況考慮了:靈活、強大則選擇Lock,快捷、安全則選擇synchronized