读写锁是一种用于同步访问共享资源的机制,它允许多个线程同时读取共享资源,但在写入时则需要独占式的访问。
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对应的value
public static final Object get(String key) {
r.lock();
try {
return map.get(key);
} finally {
r.unlock();
}
}
// 设置key对应的value,并返回旧的value
public 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();
}
}
}
锁降级是指把持住(当前拥有的)写锁,再获取到读锁,随后释放(先前拥有的)写锁的过程