1. 程式人生 > >Java併發程式設計(三):ReentrantLock

Java併發程式設計(三):ReentrantLock

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預設是非公平鎖,非公平鎖:執行緒加鎖時直接嘗試獲取鎖,獲取不到就自動到隊尾等待。而公平鎖:加鎖前先檢視是否有排隊等待的執行緒,有的話優先處理排在前面的執行緒,先來先得。