美文网首页
深入了解读写锁

深入了解读写锁

作者: 泽林呗 | 来源:发表于2018-11-26 14:28 被阅读0次

    读写状态的设计
    读写锁是通过位运算来迅速确定读和写各自的状态的,假设当前状态值为S,写状态等于S & 0x0000FFFF(将高16位全部抹去),读状态等于S>>>16(无符号补0右移16位)。当写状态增加1时,等于S+1,读状态增加1时,等于S+(1<<16),也就是S+0x00010000。

            protected final boolean tryAcquire(int acquires) {
                /*
                 * Walkthrough:
                 * 1. If read count nonzero or write count nonzero
                 *    and owner is a different thread, fail.
                 * 2. If count would saturate, fail. (This can only
                 *    happen if count is already nonzero.)
                 * 3. Otherwise, this thread is eligible for lock if
                 *    it is either a reentrant acquire or
                 *    queue policy allows it. If so, update state
                 *    and set owner.
                 */
                Thread current = Thread.currentThread();
                int c = getState();
                int w = exclusiveCount(c);
                if (c != 0) {
                    // (Note: if c != 0 and w == 0 then shared count != 0)
                    if (w == 0 || current != getExclusiveOwnerThread())
                        return false;
                    if (w + exclusiveCount(acquires) > MAX_COUNT)
                        throw new Error("Maximum lock count exceeded");
                    // Reentrant acquire
                    setState(c + acquires);
                    return true;
                }
                if (writerShouldBlock() ||
                    !compareAndSetState(c, c + acquires))
                    return false;
                setExclusiveOwnerThread(current);
                return true;
            }
    
    锁降级

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

    public void processData() {
            readLock.lock();
            if (!upstate) {
                //必须先释放读锁
                readLock.unlock();
                //锁降级从写锁获取到开始
                writeLock.lock();
                try {  
                    if (!upstate) {
                        //准备数据的流程
                        upstate = true;
                    }
                    readLock.lock();
                }finally {
                    writeLock.unlock();
                }
                //锁降级完成,写锁降级为读锁
            }
        }
    

    相关文章

      网友评论

          本文标题:深入了解读写锁

          本文链接:https://www.haomeiwen.com/subject/tbsfqqtx.html