首页 > 其他 > 详细

ReentrantReadWriteLock.Sync::tryAcquire

时间:2021-05-17 22:18:21      阅读:20      评论:0      收藏:0      [点我收藏+]
// 尝试获取写锁
protected final boolean tryAcquire(int acquires) {
    Thread current = Thread.currentThread();
    int c = getState(); // 全状态
    int w = exclusiveCount(c); // 写锁状态
    if (c != 0) {
        // 情况1:全状态!=0 且写锁状态==0, 说明当前有读锁,此时不能获取写锁
        // 情况2:写锁状态!=0 但是当前线程不是写锁拥有者,不能获取写锁
        if (w == 0 || current != getExclusiveOwnerThread())
            return false;
        // 当前线程是写锁拥有者,检查重入后次数是否超标
        if (w + exclusiveCount(acquires) > MAX_COUNT)
            throw new Error("Maximum lock count exceeded");
        // 执行重入操作,返回true
        setState(c + acquires);
        return true;
    }
    // 情况1:当前写锁应该等待
    // 情况2:cas失败
    if (writerShouldBlock() ||
        !compareAndSetState(c, c + acquires))
        return false;
    // cas成功
    setExclusiveOwnerThread(current);
    return true;
}

 

ReentrantReadWriteLock.Sync::tryAcquire

原文:https://www.cnblogs.com/jxzz/p/14777689.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!