锁降级指当前线程把持住写锁再获取到读锁,随后释放先前拥有的写锁的过程。
对于支持重入锁的同步器例如ReentrantReadWriteLock ,如果当前进程获取到了写锁是允许继续获取读锁的
tryAcquireShared(int unused) 中
if (exclusiveCount(c) != 0 && getExclusiveOwnerThread() != current)
return -1;// 如果getExclusiveOwnerThread() == current 此处不会直接返回往下到获取读锁的逻辑中
注意:如果当前线程拥有写锁,然后将其释放,最后再获取到读锁,这种分段完成的过程不能称之为锁降级。
下面是一个演示实例
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ProcessData {
private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private static final Lock readLock = rwl.readLock();
private static final Lock writeLock = rwl.writeLock();
private volatile boolean update = false;
public void processData() {
readLock.lock();
if (!update) {
readLock.unlock();
writeLock.lock();
try {
if (!update) {
update = true;
}
readLock.lock();
} finally {
writeLock.unlock();
}
}
try {
} finally {
readLock.unlock();
}
}
}