ReadWriteLock讀寫鎖

讀寫鎖,分場景優化,提高性能。java

讀寫鎖遵照的基本原則:

  1. 容許多個線程同時讀共享變量。
  2. 只容許一個線程寫共享變量。
  3. 若是一個寫線程正在執行寫操做,此時禁止多線程讀共享變量。
  4. 讀鎖與寫鎖是互斥的;寫鎖與寫鎖也是互斥的。

讀寫鎖適用於讀多寫少的場景。緩存

讀寫鎖與互斥鎖的區別:讀寫鎖運行多個線程同時讀共享變量。多線程

ReadWriteLock 是一個接口,ReentrantReadWriteLock可重入讀寫鎖是他的實現類。性能

讀寫鎖實例:優化

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @Description:
 * @Author: LYQ
 * @Date: 2019/9/10 11:12
 * @Version: V1.0
 **/
public class Cache<K,V> {
    final Map<K,V> m = new HashMap<>();
    final ReadWriteLock rwl = new ReentrantReadWriteLock();
    //讀鎖
    final Lock r =  rwl.readLock();
    //寫鎖
    final Lock w = rwl.writeLock();

    /**
     * 讀緩存
     * @param key
     * @return
     */
    V get(K key){
        //獲取讀鎖
        r.lock();
        try {
            return  m.get(key);
        }finally {
            r.unlock();
        }
    }

    /**
     * 寫緩存
     * @param key
     * @param value
     * @return
     */
    V put(K key,V value){
         w.lock();
         try{
             return m.put(key,value);
         }finally {
             w.unlock();
         }
    }

}

鎖的升級與降級

鎖升級:讀鎖->寫鎖; 先獲取讀鎖,而後升級爲寫鎖。線程

鎖降級:寫鎖->讀鎖;先獲取寫鎖,人後升級爲讀鎖。code

ReadWriteLock支持鎖的降級,不支持升級。接口

由讀鎖變寫鎖須要先把讀鎖釋放掉再獲取寫鎖,由寫鎖變讀鎖無需釋放寫鎖。ip


**** 碼字不易若是對你有幫助請給個關注****get

**** 愛技術愛生活 QQ羣: 894109590****

相關文章
相關標籤/搜索