天天看点

读写锁之——锁降级

锁降级指当前线程把持住写锁再获取到读锁,随后释放先前拥有的写锁的过程。

对于支持重入锁的同步器例如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();
        }
    }
}

           

继续阅读