Java併發程式設計(三):ReentrantLock
阿新 • • 發佈:2020-02-18
ReentrantLock是可以用來代替synchronized的。ReentrantLock比synchronized更加靈活,功能上面更加豐富,效能方面自synchronized優化後兩者效能沒有什麼太大差別。
說一下兩者的區別首先ReetrantLock是基於JDK實現層面的,而synchronized是基於JVM層面實現的。ReentrantLock可以進行tryLock嘗試鎖定,支援公平鎖的實現。
Lock lock = new ReentrantLock(); lock.lock(); try { //業務邏輯 } finally { lock.unlock(); }
一個ReentrantLock的簡單實現,要注意的是,必須要手動釋放鎖,不然很容易產生死鎖。使用sync鎖定的話遇到異常,jvm會自動釋放鎖,但是reentrantLock必須手動釋放鎖,因此經常在finally中進行鎖的釋放。
Lock lock=new ReentrantLock(); boolean locked=false; try{ try { locked=lock.tryLock(5,TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } }finally { if(locked){ lock.unlock(); } }
ReentrantLock可以進行tryLock嘗試鎖定,tryLock的方法就是進行嘗試鎖定,如果能在指定時間內得到鎖,就返回true,反之返回false。指定時間內無法鎖定時,執行緒可以決定是否繼續等待。
private static ReentrantLock lock=new ReentrantLock(true); //引數為true表示公平鎖
ReentrantLock可以指定為公平鎖,ReentrantLock和sync預設是非公平鎖,非公平鎖:執行緒加鎖時直接嘗試獲取鎖,獲取不到就自動到隊尾等待。而公平鎖:加鎖前先檢視是否有排隊等待的執行緒,有的話優先處理排在前面的執行緒,先來先得。