Synchronized和lock區別是什麼?
阿新 • • 發佈:2022-03-15
首先呢我們要知道:
synchronized是java中的一個關鍵字,而Lock是一個介面
synchronized的作用域是
- 用在某一個物件上,如:synchronized (this)
- 用在方法上,如:public synchronized void run() {}
- 用在類上,如:synchronized (SynchronizeDemo.class) {}、public synchronized static void method() {}
lock只能給方法上鎖
注意:Lock要定義成static靜態全域性變數,而不能定義在這個方法裡面,這樣才能保證每個呼叫這個方法的執行緒用的是同一個鎖,才能保證程式碼同步執行
synchronized 不需要手動獲取鎖和釋放鎖,使用簡單,發生異常會自動釋放鎖,不會造成死鎖;
而lock需要自己加鎖和釋放鎖,如果使用不當沒有unLock()去釋放鎖就會造成死鎖。
Lock更加靈活,裡面有很多的方法可以呼叫,例如tryLock(嘗試上鎖),lockInterruptibly(看看有沒有被中斷),lock(上鎖),unlock(釋放鎖)等方法
通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。
還有就是Lock提供了公平鎖
- 公平鎖:加鎖前先檢視是否有排隊等待的執行緒,有的話優先處理排在前面的執行緒,先來先得。
- 非公平所:執行緒加鎖時直接嘗試獲取鎖