读写锁,分场景优化,提升性能。

读写锁遵守的基本原则:

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

}

锁的升级与降级

锁升级:读锁->写锁; 先获取读锁,然后升级为写锁。

锁降级:写锁->读锁;先获取写锁,人后升级为读锁。

ReadWriteLock支持锁的降级,不支持升级。

由读锁变写锁需要先把读锁释放掉再获取写锁,由写锁变读锁无需释放写锁。


**** 码字不易如果对你有帮助请给个关注****

**** 爱技术爱生活 QQ群: 894109590****

09-23 22:43