首页 > 其他 > 详细

推荐几个并发工具类

时间:2019-02-06 14:27:09      阅读:189      评论:0      收藏:0      [点我收藏+]

在前面的文章中,我们介绍了太多的基本原则、技术和新概念。在本文中,我们可以在Java并发包的基础上轻松理解基于这些基本原理的三个框架工具类。

因此,由于它是一个工具类,它必须与特定的场景密不可分,所以彼此之间没有好坏之分,只有谁更合适。

信号量应用于哪种使用场景?让我们举一个流行的例子:

如果有停车场,里面只有十个停车位。当10个停车位被占用时,外面的车是不允许进入的,所以他们必须在外面等候。允许汽车进出房子。

这个场景不同于我们的一般并发场景。一般来说,我们的关键资源只能由一个线程访问,而其他线程等待。

但是,在某些情况下,关键资源允许多个线程同时访问,并且超过有限数量的线程必须阻塞并等待。

这个场景也可以使用原始的集合来实现,但它被称为“车轮制造”。Java并发框架为我们提供了一个工具类。

信号量可以说是这个场景的工具类。我们编写了一个演示来实现上述逻辑:

 

技术分享图片

你看,只有当线程出来时才允许线程进入。这是信号灯。

事实上,如果您查看源代码,您会发现信号量的实现与我们的rentrantlock非常相似,包括支持公平和不公平的政策。但是,AQS中的状态通常小于或等于1(除非重新锁定),而AQS中的状态小于或等于10,记录了剩余可用资源的临界量。

所以,信号量本身就是一个问题。如果线程重新进入关键区域,是否需要减少可用的关键资源数量?

事实上,从Java管理员的角度来看,已经进入关键区域的线程是“领主”,它们的请求将首先被满足,即使它们拥有的资源没有被释放。

因此,在emaphore机制中,线程进入关键区域后可能会占用所有关键资源。

显然,我们得到的是一个代理对象,它调用addEmployee2Controller()方法,addEmployee2Controller()方法的逻辑是目标。addEmployee(),它调用原始对象的addEmployee()。所以这个调用根本没有事务,更不用说Spring事务传播机制了。

循环屏障 CyclicBarrier

循环屏障的实现与计算下载非常相似。首先,我们介绍循环势垒,然后比较它的区域和相似性。

考虑这种情况:

车总是在楼下一个车夫上车后出来,开到地铁站,然后回来接下一个车夫。

在这种情况下,我们考虑如何实现:

循环屏障就像一个屏障。实例化时,传入两个参数。第一个参数指定屏障可以拦截多少线程,然后打开屏障。第二个参数指定最后一个线程到达屏障所需的附加操作。

一般来说,当最后一个线程到达屏障时,屏障打开,释放前面的所有线程,最后再次关闭屏障。

循环屏障只需一次等待就能完成所有的功能。我们总结了这种方法的逻辑。

首先,减少一次可用资源的数量

如果可用资源的数量为零,则意味着它是最后一个线程,因此它执行我们传入的附加操作,唤醒所有到达并等待的线程,并重新打开屏障计数。
否则,它意味着它不是最后一个线程,因此它在到条件队列的循环中阻塞自己的线程。

看了循环势垒,你会发现它很像我们的倒计时螺栓。让我们解释一下它们之间的区别和联系。

通过上面的测试,我们可以发现,如果类中没有调用带注释的@transactional方法的Transaction方法,那么最终的结论是没有事务。所以,如果我将这个注释方法移动到另一个服务对象,是否存在事务?

好的,这是在Java并发包下我们可以很好使用的三个工具类。前两个底层实现几乎依赖于显式锁的原理和方法,第二个底层实现是使用显式锁条件变量重建的轮子。它们都是非常有用的工具。

此外,我们还介绍了并发的全部内容和它的基本核心。总共有14篇文章,从基本的线程概念到锁原则,到线程池,再到异步任务,都认为它们足够详细。你知道多少?

你不记得也没关系。我还向您提供了思维导图的摘要,其中列出了上面提到的基本内容。你可以比较一下。也欢迎你相信我并与我讨论。

推荐几个并发工具类

原文:https://www.cnblogs.com/aishangJava/p/10353694.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!