程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java並發編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖

Java並發編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖

編輯:關於JAVA

Java並發編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖。本站提示廣大學習愛好者:(Java並發編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖)文章只能為提供參考,不一定能成為您想要的結果。以下是Java並發編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖正文


在Java5.0之前,只要synchronized(內置鎖)和volatile. Java5.0後引入了顯示鎖ReentrantLock.

ReentrantLock概略

ReentrantLock是可重入的鎖,它分歧於內置鎖, 它在每次應用都須要顯示的加鎖息爭鎖, 並且供給了更高等的特征:公正鎖, 准時鎖, 有前提鎖, 可輪詢鎖, 可中止鎖. 可以有用防止逝世鎖的活潑性成績.ReentrantLock完成了

Lock接口:


  public interface Lock {
          //壅塞直到取得鎖或許中止
          void lock();

          //壅塞直到取得鎖或許中止拋異常
          void lockInterruptibly() throws InterruptedException;

          //只要鎖可用時才取得,不然直接前往
          boolean tryLock();

          //只要鎖在指准時間內可用時才取得,不然直接前往,中止時拋異常
          boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

          void unlock();

          //前往一個綁定在這個鎖上的前提
          Condition newCondition();
  }

Lock應用

        Lock lock = new ReentrantLock();
        lock.lock();
        try{
            //更新對象狀況
        }finally{
            //這裡留意,必定要有finally代碼塊去解鎖
            //不然輕易形成逝世鎖等活潑性成績
            lock.unlock();
        }
 

ReentrantLock特征

輪詢鎖的和准時鎖

可輪詢和可准時的鎖要求是經由過程tryLock()辦法完成的,和無前提獲得鎖紛歧樣. ReentrantLock可以有靈巧的容錯機制.逝世鎖的許多情形是因為次序鎖惹起的, 分歧線程在試圖取得鎖的時刻壅塞,而且不釋放本身曾經持有的鎖, 最初形成逝世鎖. tryLock()辦法在試圖取得鎖的時刻,假如該鎖曾經被其它線程持有,則依照設置方法連忙前往,而不是一向壅塞等下去,同時在前往後釋放本身持有的鎖.可以依據前往的成果停止重試或許撤消,進而防止逝世鎖的產生.

公正性

ReentrantLock結構函數中供給公正性鎖和非公正鎖(默許)兩種選擇。所謂公正鎖,線程將依照他們收回要求的次序來獲得鎖,不許可插隊;但在非公正鎖上,則許可插隊:當一個線程產生獲得鎖的要求的時辰,假如這個鎖是可用的,那這個線程將跳過地點隊列裡期待線程並取得鎖。我們普通願望一切鎖長短公正的。由於當履行加鎖操作時,公正性將講因為線程掛起和恢單線程時開支而極年夜的下降機能。斟酌這麼一種情形:A線程持有鎖,B線程要求這個鎖,是以B線程被掛起;A線程釋放這個鎖時,B線程將被叫醒,是以再次測驗考試獲得鎖;與此同時,C線程也要求獲得這個鎖,那末C線程極可能在B線程被完整叫醒之前取得、應用和釋放這個鎖。這是種共贏的局勢,B獲得鎖的時辰(B被叫醒後能力獲得鎖)並沒有推延,C更早地獲得了鎖,而且吞吐量也取得了進步。在年夜多半情形下,非公正鎖的機能要高於公正鎖的機能。

可中止獲鎖獲得操作

lockInterruptibly辦法可以或許在獲得鎖的同時堅持對中止的呼應,是以無需創立其它類型的弗成中止壅塞操作。

讀寫鎖ReadWriteLock

​ReentrantLock是一種尺度的互斥鎖,每次最多只要一個線程能持有鎖。讀寫鎖紛歧樣,裸露了兩個Lock對象,個中一個用於讀操作,而別的一個用於寫操作。

public interface ReadWriteLock {
    /**
     * Returns the lock used for reading.
     *
     * @return the lock used for reading.
     */
    Lock readLock();

    /**
     * Returns the lock used for writing.
     *
     * @return the lock used for writing.
     */
    Lock writeLock();
}

可選擇完成:

1.釋放優先
2.讀線程插隊
3.重入性
4.升級
5.進級

ReentrantReadWriteLock完成了ReadWriteLock接口,結構器供給了公正鎖和非公正鎖兩種創立方法。讀寫鎖實用於讀多寫少的情形,可以完成更好的並發性。
 
示例

public class ReadWriteMap<K, V> {
    private Map<K, V> map;
    private final ReadWriteLock lock = new ReentrantReadWriteLock();

    private final Lock readLock = lock.readLock();
    private final Lock writeLock = lock.writeLock();

    public ReadWriteMap(Map<K, V> map) {
        this.map = map;
    }

    public V get(K key) {
        readLock.lock();
        try {
            return map.get(key);
        } finally {
            readLock.unlock();
        }
    }

    public void put(K key, V value) {
        writeLock.lock();
        try {
            map.put(key, value);
        } finally {
            writeLock.unlock();
        }
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved