并发包同步器的核心AQS-深入-释放锁

在独占模式下释放锁

 public final boolean release(int arg) {
        // 如果释放锁成功,则唤醒head节点后边的节点
        if (tryRelease(arg)) {
            Node h = head;
            if (h != null && h.waitStatus != 0)
                unparkSuccessor(h);
            return true;
        }
        return false;
    }

 protected boolean tryRelease(int arg) {
        throw new UnsupportedOperationException();
    }

 private void unparkSuccessor(Node node) {
        // 如果节点的waitStatus是负数则清0
        int ws = node.waitStatus;
        if (ws < 0)
            compareAndSetWaitStatus(node, ws, 0);

       // 唤醒当前节点后面的节点,如果后面的节点是取消状态那么从后往前找一个非取消状态的节点
        Node s = node.next;
        if (s == null || s.waitStatus > 0) {
            s = null;
            for (Node t = tail; t != null && t != node; t = t.prev)
                if (t.waitStatus <= 0)
                    s = t;
        }
        if (s != null)
            LockSupport.unpark(s.thread);
    }

和tryAcquire一样,tryRelease也需要子类去实现

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容