aqs阻塞与非阻塞实现问题

发布于 2022-09-05 22:49:06 字数 168 浏览 33 评论 0

最近在看aqs有不处不解,在acquire时,实际是 LockSupport.park(this);也就是AbstractQueuedSynchronizer,而release时实际是 LockSupport.unpark(s.thread),不太明白这个阻塞操作与非阻塞操作如何做到的,咋一看根本不是在一个对象的??求解

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

<逆流佳人身旁 2022-09-12 22:49:06

LockSupport.park(Object blocker)实际上的还是阻塞当前线程,只是还传递一个blocker对象,赋值在Thread对象的parkBlocker属性上。如果直接调用LockSupport.park()这个方法就没那么复杂了,只是阻塞当前线程。

//具体实现看setBlocker(t, blocker);
public static void park(Object blocker) {
        Thread t = Thread.currentThread();
        setBlocker(t, blocker);
        unsafe.park(false, 0L);
        setBlocker(t, null);
    }
//可以通过LockSupport.getBlocker(Thread thread)方法拿到blocker对象,jdk文档里面描述主要是用来监控线程是被哪个对象锁住的
 public static Object getBlocker(Thread t) {
        if (t == null)
            throw new NullPointerException();
        return unsafe.getObjectVolatile(t, parkBlockerOffset);
    }

LockSupport.park()的线程快照
LockSupport.park()

LockSupport.park(Object object)的线程快照
图片描述

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文