深入理解AQS底层源码(二)——lock.unlock()

接着上一次线程2和线程3park后,需要unpark()唤醒。

第一步:线程1执行完成后,调用lock.lock()方法,实际调用的是sync.release(1)方法;

第二步:线程1调用底层的release(int arg)方法,走到tryRelease(arg)方法;

getState() = 1,因为之前线程1加锁后state设值为1,它也是volatile修饰的。

Thread.currentThread() = 线程1,c = 0,free = true,setState(0),返回true。

第三步:条件 = true,进入if代码块。head为哨兵节点也就是空节点,waitStatus = -1(前面设值过)。

执行到unparkSuccessor(h),statue被设值为0,s = 哨兵节点的尾节点 = 线程2的节点,waitStatus = -1,走LockSupport.unpark(s.thread),线程2被唤醒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值