锁降级: 写线程获取写入锁后可以获取读取锁, 然后释放写入锁, 这样就从写入锁变成了读取锁, 从而实现锁降级的特征
public class LockDegrade {
public static void main(String[] args) {
ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
Lock writeLock = reentrantReadWriteLock.writeLock();
Lock readLock = reentrantReadWriteLock.readLock();
writeLock.lock();
readLock.lock();
writeLock.unlock();
readLock.unlock();
System.out.println("程序正常运行");
}
}
运行结果
锁降级以后, 写锁并不会直接降成读锁, 不会随着读锁的释放而释放, 因此需要显式地释放写锁
锁降级的应用场景: 对于数据比较敏感, 需要在对数据修改以后, 获取到修改后的值, 并进行接下来的其它操作
public class LockDegradeDemo {
private int i = 0;
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private Lock writerLock = readWriteLock.writeLock();
private Lock readLock = readWriteLock.writeLock();
public void doSomething() {
writerLock.lock();
try {
i++;
readLock.lock();
} finally {
writerLock.unlock();
}
try {
// 模拟其它复杂操作
Thread.sleep(500L);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
if (i == 1) {
System.out.println("i的值是" + i);
} else {
System.out.println("i = " + i);
}
} finally {
readLock.unlock();
}
}
public static void main(String[] args) {
LockDegradeDemo lockDegradeDemo = new LockDegradeDemo();
for (int i = 0; i < 5; i++) {
new Thread(() -> {
lockDegradeDemo.doSomething();
}).start();
}
}
}
运行结果