读写锁,分场景优化,提升性能。
读写锁适用于读多写少的场景。
读写锁与互斥锁的区别:读写锁运行多个线程同时读共享变量。
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支持锁的降级,不支持升级。
由读锁变写锁需要先把读锁释放掉再获取写锁,由写锁变读锁无需释放写锁。