读写锁, 分场景优化, 提升性能。
读写锁遵守的基本原则:
- 允许多个线程同时读共享变量。
- 只允许一个线程写共享变量。
- 如果一个写线程正在执行写操作,此时禁止多线程读共享变量。
- 读锁与写锁是互斥的;写锁与写锁也是互斥的。
读写锁适用于读多写少的场景。
读写锁与互斥锁的区别:读写锁运行多个线程同时读共享变量。
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