Lock 源码解析

AQS简单了解
JAVA并发包中,有很多锁方法,但是Lock是怎么实现?以ReentrantLock为例,来管中窥豹一下。

ReentrantLock reentrantLock=new ReentrantLock();
        reentrantLock.lock();
        reentrantLock.unlock();
 // 看看  lock方法是怎么实现的?
  public void lock() {
        sync.acquire(1);
    }
    

//查看 acquire 将会跳转到 AbstractQueuedSynchronizer (AQS)抽象类的

 public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }

//跳转到tryAcquire 方法 ,可以在 AQS类找到该方法,但是 由于 ReentrantLock 内部来继承了 AQS, 且改写了该方法,故实际调用的应该是子类的方法。

 final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            //获取一个 state 状态
            int c = getState();
            if (c == 0) {
                if (compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }

//现在 我们假设 有两个 线程 (A、B)来竞争一个Lock,如果 A竞争成功,在上述改方法中 会返回 true

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值