资讯专栏INFORMATION COLUMN

读源码笔记 Java AbstractQueuedSynchronizer

selfimpr / 1936人阅读

摘要:总结总的来说,操作顺序是进入队列唤醒,成功获得锁将状态变为并将其从转到使再次获得锁执行余下代码。当然这是理由状态下,为了讨论及的原理,实际的操作时序也有可能变化。

AQS Condition

最近面试被问到java concurrent包下有哪些熟悉的,用过的工具。因此来回顾一下,这些工具的底层实现,AbstractQueuedSynchronizer。在网上看到了其他人的一些技术博客,我将源码贴出,分享下自己不同的见解。

分析源码

对于初看源码的我来说,很奇怪,为什么明明“waitThread1”已经拿到锁的情况下,而“singalThread”还能获取同样的锁而运行呢。这就得看源码才能分析明白。
一开始waitThread拿到了锁,然后调用了condition调用了await方法。
看看await方法:

首先方法中会构建一个node用来表示该node现在在Condition的queue中。Condition的queue维护着一连串的node,当前线程被包含在其中。

接下来fullyRelease方法会将AQS的当前状态即state置为0(这里说的是具体的ReentrantLock的tryRelease实现方式,因为它是独占锁。)fullyRelease其中还会将AQS中维护的queue(其中同样是node,只是Condition中的node记录的是等待condition的node,AQS中的queue是等待锁的node)中的线程释放出来。注意,执行完这一步之后,若另一个线程singalThread由于lock而得不到锁,已经在AQS的queue中,处于wait状态,这时他将被唤醒,然后获取到锁,从AQS的queue中删除。

当singalThread执行完singal的之中,就会将condition中的node移到AQS的queue上去。
具体代码在condition中的signal方法中:

将其node的状态改为SIGNAL,注意这个时候一般node还没有被唤醒。

通常上面这一句不会为true,除非没有能把目前node的状态改为SIGNAL,或者node state大于0了,这个时候说明任务呗取消了,那么以上两种情况都直接唤醒线程。除了上述两种情况外,由signalthread的unlock操作唤醒在AQS上的线程。

总结

总的来说,操作顺序是:

waitthread lock

Signalthread lock 进入AQS队列wait

waitthread await 唤醒 Signalthread,Signalthread成功获得锁

Signalthread signal 将waitthread 状态变为signal并将其从condition queue转到AQS queue

Signalthread unlock 使waitthread再次获得锁 执行余下代码。
当然这是理由状态下,为了讨论AQS及condition的原理,实际的操作时序也有可能变化。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70284.html

相关文章

  • 源码笔记 Java AbstractQueuedSynchronizer

    摘要:总结总的来说,操作顺序是进入队列唤醒,成功获得锁将状态变为并将其从转到使再次获得锁执行余下代码。当然这是理由状态下,为了讨论及的原理,实际的操作时序也有可能变化。 AQS Condition 最近面试被问到java concurrent包下有哪些熟悉的,用过的工具。因此来回顾一下,这些工具的底层实现,AbstractQueuedSynchronizer。在网上看到了其他人的一些技术博客...

    YuboonaZhang 评论0 收藏0
  • 高并发 - 收藏集 - 掘金

    摘要:在中一般来说通过来创建所需要的线程池,如高并发原理初探后端掘金阅前热身为了更加形象的说明同步异步阻塞非阻塞,我们以小明去买奶茶为例。 AbstractQueuedSynchronizer 超详细原理解析 - 后端 - 掘金今天我们来研究学习一下AbstractQueuedSynchronizer类的相关原理,java.util.concurrent包中很多类都依赖于这个类所提供的队列式...

    levius 评论0 收藏0
  • 高并发 - 收藏集 - 掘金

    摘要:在中一般来说通过来创建所需要的线程池,如高并发原理初探后端掘金阅前热身为了更加形象的说明同步异步阻塞非阻塞,我们以小明去买奶茶为例。 AbstractQueuedSynchronizer 超详细原理解析 - 后端 - 掘金今天我们来研究学习一下AbstractQueuedSynchronizer类的相关原理,java.util.concurrent包中很多类都依赖于这个类所提供的队列式...

    fantix 评论0 收藏0
  • 高并发

    摘要:表示的是两个,当其中任意一个计算完并发编程之是线程安全并且高效的,在并发编程中经常可见它的使用,在开始分析它的高并发实现机制前,先讲讲废话,看看它是如何被引入的。电商秒杀和抢购,是两个比较典型的互联网高并发场景。 干货:深度剖析分布式搜索引擎设计 分布式,高可用,和机器学习一样,最近几年被提及得最多的名词,听名字多牛逼,来,我们一步一步来击破前两个名词,今天我们首先来说说分布式。 探究...

    supernavy 评论0 收藏0
  • 高并发

    摘要:表示的是两个,当其中任意一个计算完并发编程之是线程安全并且高效的,在并发编程中经常可见它的使用,在开始分析它的高并发实现机制前,先讲讲废话,看看它是如何被引入的。电商秒杀和抢购,是两个比较典型的互联网高并发场景。 干货:深度剖析分布式搜索引擎设计 分布式,高可用,和机器学习一样,最近几年被提及得最多的名词,听名字多牛逼,来,我们一步一步来击破前两个名词,今天我们首先来说说分布式。 探究...

    ddongjian0000 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<