读写锁:适用于读多写少的场景
读写锁是一种用于同步访问共享资源的机制,它允许多个线程同时读取共享资源,但在写入时则需要独占式的访问。
Java中的读写锁可以通过java.util.concurrent.locks包中的ReadWriteLock接口和它的实现类ReentrantReadWriteLock来实现。ReadWriteLock接口定义了两个锁,一个用于读操作,一个用于写操作。ReentrantReadWriteLock是一个可重入的读写锁实现,它提供了公平和非公平两种模式。
使用读写锁可以显著提高并发性能,因为它允许多个线程同时读取共享资源,而不会互相干扰。但是,在写入共享资源时,其他线程仍然可以读取共享资源,但无法进行写入操作。这样可以避免长时间独占资源,从而提高并发性能。
通过一个缓存示例说明读写锁的使用方式,代码示例如下
public class Cache {static Map<String, Object> map = new HashMap<String, Object>();static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();static Lock r = rwl.readLock();static Lock w = rwl.writeLock();// 获取一个key对应的valuepublic static final Object get(String key) {r.lock();try {return map.get(key);} finally {r.unlock();}}// 设置key对应的value,并返回旧的valuepublic static final Object put(String key, Object value) {w.lock();try {return map.put(key, value);} finally {w.unlock();}}// 清空所有的内容public static final void clear() {w.lock();try {map.clear();} finally {w.unlock();}}
}
锁降级是指把持住(当前拥有的)写锁,再获取到读锁,随后释放(先前拥有的)写锁的过程