JUC | READ_WRITE_LOCK
READ_WRITE_LOCK 读写锁
读写锁的出现是为了提高锁的效率,实现在
读与读之间锁是共享的,写与写、读与写之间锁是互斥的。这样在 读多写少 的场景中十分适合使用读写锁。
源码
public interface ReadWriteLock {
Lock readLock();
Lock writeLock();
}
在 JDK 中 ReentrantReadWriteLock 是 ReadWriteLock 的实现,同时具有可重入性,
读写锁的升级 & 降级
对于对写锁而言,锁升级是指:从读锁变成写锁,锁降级是指:从写锁变成读锁。
ReentrantReadWriteLock锁可以降级,但是不可以升级。
读锁无法升级为写锁
public class T10_ReadWriteLock2 {
public static void main(String[] args) {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
lock.readLock().lock();
System.out.println("read");
lock.writeLock().lock();
System.out.println("write");
}
}
写锁可以降级为读锁
public class T10_ReadWriteLock3 {
public static void main(String[] args) {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
lock.writeLock().lock();
System.out.println("write");
lock.readLock().lock();
System.out.println("read");
}
}
注意:虽然写锁降级成读锁,但并不会自动释放当前线程获取的写锁,因此仍然需要显示的释放,否则别的线程永远也获取不到写锁。