源码分析:同步基础框架——AbstractQueuedSynchronizer(AQS) (5)

unlock方法调用的是sync.releaseShared(1),releaseShared也是AQS 方法中的方法,不允许被继承,表示将同步状态设置回初始状态,将锁释放。

public final boolean releaseShared(int arg) { // tryReleaseShared 我们自己实现的逻辑 if (tryReleaseShared(arg)) { // 释放锁失败,继续释放,自旋直到释放成功 doReleaseShared(); return true; } return false; } private void doReleaseShared() { // 自旋 for (;;) { Node h = head; // 同步等待的队列不为空 if (h != null && h != tail) { int ws = h.waitStatus; // 检查状态是否要唤醒下一个节点的线程 if (ws == Node.SIGNAL) { if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0)) continue; // loop to recheck cases // 加入h节点是持有锁的节点,会唤醒它的下一个节点线程 unparkSuccessor(h); } else if (ws == 0 && !compareAndSetWaitStatus(h, 0, Node.PROPAGATE)) continue; // loop on failed CAS } // 理论上唤醒一个就会退出 if (h == head) // loop if head changed break; } } 总结

AQS是Java中可以实现同步器功能的一个基础框架,我们自己也可以基于AQS实现想要的同步功能

AQS 中用Node节点维护了一个双向链表,用来保存排队获取锁的线程,已经用来唤醒线程

AQS 中为了一个state的同步状态变量,可以基于这个变量实现很多功能

实现AQS的几个重要API,就可以实现一个简单同步器的功能,其他像自旋,排队,阻塞,唤醒,AQS都已经帮我们做好了

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssyjz.html