为了账号安全,请及时绑定邮箱和手机立即绑定

线程池等内容

标签:
Html5

面试久了,你会发现Java并发编程是面试的重点考察点。并且随着公司的发展,用户量级会与日俱增,并发的问题自然避免不了,因此具备处理并发能力的 Java 程序员必然是广大公司渴求的人才。

接下来和大家分享我对Java并发工具知识的见解,全文主要分为如下7大点:

1.   Java并发工具的痛点

2.   三大类:线程安全、方便管理、互相配合

3.   第一类:为了线程安全

4.   第二类:为了管理线程

5   第三类:为了线程协作——控制并发流程



1      Java并发工具的痛点

Java并发中,一块非常重要的内容就是对于各种工具类的理解,常见的广义的并发工具包括:线程池、ConcurrentHashMap、AtomicInteger、CopyOnWriteArrayList、ArrayBlockingQueue、synchronized、LongAdder、ThreadLocal、各种Lock、Future、CountDownLatch、Semaphore等等。

以上这些工具,大家或多或少肯定都使用过,但是如果让我们自己编写功能类似的工具类,就很容易出错,因为我们可能会考虑不周;而JDK的常用工具类是经过了千万人检验的,值得信赖且功能完善。

我们应该学会使用,并深入理解这些工具类的原理。非必须情况下,没有必要重复造轮子,因为如果让我们自己写一个经得起考验的功能完善的线程池,那其实是非常困难的,有几千行代码,实际上,能完全读懂就已经不太容易了。

从刚才那一长串的工具类的名字中可以看出,并发工具的数量很多,而且功能好像也不尽相同,不容易完全掌握。


2      三大类:线程安全、方便管理、互相配合

Java并发工具按照目的,一共分为3类:这三类分别是:为了线程安全、为了管理线程、为了线程协作。

有了这样的分类,未来我们拿到一个不熟悉的并发工具类的时候,就可以对号入座。先建立起全局的概念,未来的学习就会容易很多。

下面我们对这三个类别分别展开描述。

3      第一类:为了线程安全

第一类是最常见的工具类,最典型的有各种锁、原子类、ConcurrentHashMap等,这些工具的目的都是帮助我们在并发的情况下保证线程安全。

就达到线程安全的工具类而言,有两个分类的角度,第一个是从底层原理来分,第二个是从使用者程序员的角度来分类。这两种分类只是视角不同,但是本质相同,是一一对应的关系。

4      第二类:为了管理线程

除了刚才说到的为了线程安全的工具类之外,现在将要介绍的“管理线程”也是很重要的一类并发工具,最典型的就是线程池和Future相关类。

 

 获取子线程的运行结果——Future相关类

Future的核心思想是:一个方法的计算过程可能非常耗时,一直在原地等待方法返回,显然不明智。可以把该计算过程放到线程池去执行,并通过Future去控制方法的计算过程,在计算出结果后直接获取该结果,这样就避免了傻傻等待造成的时间浪费。

在JDK 8中,还引入了很好用的CompletableFuture,可以完成例如“等待多个异步任务完成后,获取到结果,再利用这些结果执行接下来的任务”等更复杂的功能。

 

5      第三类:为了线程协作——控制并发流程的工具类

除了以上讲的“为了线程安全”、“为了管理线程”外,第三类并发工具类就是为了线程之间的协作互助。

控制并发流程的工具类,作用就是帮助我们程序员更容易得让线程之间合作,让线程之间相互配合,来满足业务逻辑,比如让线程A等待线程B执行完毕后再执行等合作策略。

控制并发流程的工具类简称同步工具类,主要有以下几个:

作用

说明

Semaphore

信号线,可以通过控制“许可证”的数量,来保证线程之间的配合

线程只有在拿到“许可证”后才能继续运行。相比于其他的同步器,更灵活

CyclicBarrier

线程会等待,直到足够多线程达到了事先规定的数目。一旦达到触发条件,就可以进行下一步的动作。

适用于线程之间相互等待处理结果就绪的场景

Phaser

和CyclicBarrier类似,但是计数可变

Java 7加入的

CountDownLatch

和CyclicBarrier类似,数量递减到0时,触发动作

不可重复使用

Exchanger

让两个线程在合适时交换对象

适用场景:当两个线程工作在同一个类的不同实例上时,用于交换数据

Condition

可以控制线程的“等待”和“唤醒”

是Object.wait(), notify(), notifyAll()的升级版,功能更强大,也更安全

 


点击查看更多内容
40人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
2831
获赞与收藏
707

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消