什么是Java并发队列同步器?

                                          什么是Java并发队列同步器?


                                          从:泥泥匠@ bysocket.com https://mp.weixin.qq.com/s/HfyhxqlbXnCXrmFoJHkf9g 本文目录 Java的内置锁一直存在争议。在JDK 1.6之前,同步重量级锁的性能相对较低。虽然在1.6之后,实现了大量的锁优化策略,但与Lock相比是同步的。一些缺陷:尽管synchronized提供了一个方便的隐式锁释放锁机制(基于JVM机制),它缺乏获取和释放锁,中断,超时获取锁的可操作性,并且它是独占的在高并发场景中性能大大降低。 在介绍Lock之前,我们需要熟悉一个非常重要的组件。掌握JUC包中的许多问题不是问题。该组件是AQS。 AQS,AbstractQueuedSynchronizer,它是队列同步器。它是构建锁或其他同步组件(如ReentrantLock,ReentrantReadWriteLock,Semaphore等)的底层框架,JUC Concurrent Package(Doug Lea)的作者希望它是大多数同步需求的基础。它是JUC Concurrency Pack的核心基础结构组件。 AQS解决了实现同步器所涉及的许多详细问题,例如获取同步状态和FIFO同步队列。构建基于AQS的同步器可以带来很多好处。它不仅大大减少了实施工作量,而且还不必处理多个地点发生的竞争问题。 在基于AQS的同步器中,阻塞只能在一次发生,这减少了上下文切换的开销并提高了吞吐量。同时,在设计AQS时充分考虑了可扩展线路,因此J.U.C中所有基于AQS的同步器都可以获得这一优势。 AQS的主要用途是继承,它通过继承同步器并实现其抽象方法来管理同步状态。 AQS使用int类型的成员变量状态来指示同步状态。当state> 0表示已获取锁定时,当state=0时,锁定被释放。它提供了三种方法(getState(),setState(int newState),compareAndSetState(int expect,int update)来操作同步状态。当然,AQS确保对状态的操作是安全的。 AQS通过内置FIFO同步队列完成资源获取线程的排队工作。如果当前线程无法获取同步状态(锁定),则AQS将当前线程和等待状态构造到节点(节点)并加入它。同步队列将同时阻止当前线程。释放同步状态后,节点中的线程将被唤醒并尝试再次获取同步状态。 AQS主要提供以下方法: 那么什么是CLH同步队列? 上面提到AQS在内部维护一个FIFO队列,它是CLH同步队列。 CLH同步队列是FIFO双向队列。 AQS依赖它来管理同步状态。如果当前线程无法获取同步状态,AQS将构造当前线程等待状态和其他信息到节点(节点)并加入它。阻止同步队列时,将阻止当前线程。当释放同步状态时,第一个节点将被唤醒(公平锁定),以便它再次尝试获取同步状态。 在CLH同步队列中,节点表示一个线程,该线程包含线程的线程,状态(waitStatus),前体节点(prev)和后继节点(next),其定义如下: CLH同步队列结构如下: 我们学习了数据结构,CLH队列条目很简单,无非是尾点指向新节点,新节点的prev指向当前最后一个节点,当前最后一个节点的下一个指向当前节点。代码我们可以看一下addWaiter(Node node)方法: addWaiter(节点节点)首先通过快速尝试设置尾节点。如果失败,则调用enq(Node节点)方法来设置尾节点。 在上面的代码中,两种方法都通过CAS方法compareAndSetTail(Node expect,Node update)设置尾节点,这确保了节点是线程安全添加的。在enq(节点节点)方法中,AQS确保可以通过“无限循环”方法正确添加节点。只有在成功添加之后,当前线程才会从方法返回,否则它将继续执行。 流程图如下: CLH同步队列跟随FIFO。在第一个节点的线程释放同步状态后,它将唤醒其后继节点(下一个),并且后继节点将在同步状态成功时将自身设置为第一个节点。这个过程非常简单,头部执行节点可以断开原始节点的下一个节点和当前节点的prev。注意,此过程不需要使用CAS来保证,因为只有一个线程可以成功获得同步状态。流程图如下: 代码示例 本文的读者可以在以下存储库中查看alibaba/java/ParentClass.java: 如果您对这些感兴趣,欢迎来自明星,关注,收藏,转发支持! 参考资料

                                          上一篇:大自然的日历,夏日夜空的景观,这是夏天的三角形

                                          下一篇:中国的最低点是位于中国新疆东部吐鲁番盆地的“艾丁湖”。

                                          相关推荐:世界十大工具品牌 | 时代杂志:在他的余生中,孩子可以记住父母的5个时刻。 | DOTA2震中杯:MC斧王燮,W33亮丽活,Liquid2-0捅穿LGD

                                          评论

                                          您的邮箱地址不会被公布 *

                                          您可以使用这些html标签 <a href="#" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>