国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java并發編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖

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

2019-12-16 13:20junjie JAVA教程

這篇文章主要介紹了Java并發編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖,本文講解了ReentrantLock概況、Lock接口、Lock使用、輪詢鎖的和定時鎖、公平性、可中斷獲鎖獲取操作等內容,需要的朋友可以參考下

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();
        }
    }
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品视频 | 欧美不卡一区二区三区 | h小视频在线 | 久久久久久夜 | 不卡黄色 | 欧美成人免费在线视频 | 亚洲 欧美 精品 | 成人亚州 | 国产中文字幕亚洲 | 亚洲 精品 综合 精品 自拍 | 久久亚洲天堂 | 成人黄色电影小说 | 免费观看国产精品 | 欧美日韩在线精品 | 成人激情免费视频 | 亚洲综合二区 | 国产精选一区二区三区不卡催乳 | 无毒黄网 | 狠狠干干 | 免费国产一区二区 | 国产一区二区三区精品久久久 | 一级做a爰片性色毛片精油 欧美中文字幕在线观看 | 国产伦理一区 | 深夜在线视频 | 久久国内精品 | 久久精品中文字幕大胸 | 视频一区二区三区免费观看 | 1000部精品久久久久久久久 | 亚洲美女性视频 | 久久成人精品视频 | 含羞草www国产在线视频 | 亚洲a在线观看 | 亚洲天堂中文字幕 | 国产精品毛片久久久久久久av | 亚洲在线播放 | 国产成人黄色网址 | 日韩中文字幕在线播放 | 国产在线不卡 | 这里只有精品在线 | 午夜视频福利在线观看 | 欧美在线a |