当前线程获取锁失败,会构造一个Node节点,添加到同步队列的尾端,同时阻塞当前线程,当同步状态释放时,会唤醒首节点,让首节点再次竞争获取锁
1.当线程获取同步状态失败时,会加入到同步队列中 2.加入同步队列的尾节点时,必须要保证线程安全 3.在加入尾节点时,通过cas机制,compareAndSetTail()保证线程安全 4.只有设置成功后,才与之前的尾节点建立联系。
1.设置首节点是没有线程安全问题的 2.因为释放同步状态时,只会唤醒后继节点 3.后继节点获取到同步状态时,就会将自己设置为首节点,并断开与原首节点的引用。
满足上面两个条件,则退出自旋
调用release释放锁,通过unparkSuccessor唤醒头节点的后驱节点
public final boolean release(int arg) {
if (tryRelease(arg)) {
Node h = head;
if (h != null && h.waitStatus != 0)
unparkSuccessor(h);
return true;
}
return false;
}
关注公众号领取2022最新面试题一套和项目源码