synchronized與Lock有什麼異同
阿新 • • 發佈:2019-02-05
Java語言提供了兩種鎖機制來實現對某個共享資源的同步:synchronized和Lock.其中synchronized使用Object物件本身的nofify、wait、nofityAll排程機制,而Lock可以使用Condition進行執行緒之間的排程,完成synchronized實現的所有功能。
具體而言,二者的區別如下:
- 用法不一樣。在需要同步的物件中加入synchronized控制,synchronized既可以載入方法的前面,也可以加在特定程式碼塊中,括號中表示需要鎖的物件。而Lock需要顯示地指定起始位置和終止位置。synchronized是託管給Jvm執行的,而Lock的鎖定是通過程式碼實現的,它又比synchronized更精確的執行緒含義;
- 效能不一樣。在Jdk5增加了一個Lock介面的實現類ReentranLock。它不僅擁有和synchronized相同的並非性和記憶體語義,還多了鎖投票、定時鎖、等候和中斷鎖。它們的效能在不同的情況下會有所不同:在資源競爭不是很激烈的情況下,synchronized的效能要優於ReentranLock,但是在資源競爭很激烈的情況下,synchronized的效能會下降很快而ReentranLock的效能基本保持不變;
- 鎖機制不一樣。synchronized獲得鎖和釋放的方式都在結構中,當獲取多個鎖時,必須以相反的順序釋放,並且使自動解鎖,不會因為出了異常而導致沒有被釋放從餓餓印發死鎖。而Lock則需要開發人員手動去釋放,並且必須在finally塊中釋放,否則會引起死鎖的問題發生。此外,Lock還提供了更強大的功能,它的tryLock()方法可以採用非阻塞的方式去獲取鎖。