面试久了,你会发现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等,这些工具的目的都是帮助我们在并发的情况下保证线程安全。
就达到线程安全的工具类而言,有两个分类的角度,第一个是从底层原理来分,第二个是从使用者程序员的角度来分类。这两种分类只是视角不同,但是本质相同,是一一对应的关系。
除了刚才说到的为了线程安全的工具类之外,现在将要介绍的“管理线程”也是很重要的一类并发工具,最典型的就是线程池和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()的升级版,功能更强大,也更安全 |
共同学习,写下你的评论
评论加载中...
作者其他优质文章