并发工具类

使用同步工具类

闭锁

在线程执行过程中用一把锁把门锁住,在开锁之前线程无法通过这道门,只有当满足了开锁的条件之后,锁才会自动打开。

常用的闭锁工具类:CountDownLatch、CyclicBarrier、FutureTask。

闭锁应用场景

1.有a、b、c三个线程一起执行,可是a线程需要等待b、c线程任务执行完毕才继续往下执行。

2.一个线程的某步计算依赖于其它线程的执行结果。

用生活例子举例,小明约小张和小李吃饭,小明先到了,可是要等到小张和小李都到齐才能开始点菜吃饭,小明到饭店后等待小张小李到齐的这个步骤就是一个闭锁,小张和小李到齐是闭锁的两个开锁条件,只有满足了开锁条件,才能够继续点菜吃饭,否则只能干坐着等待。

1111.png
输出结果:
2222.png

以上demo便完成了一个闭锁的使用,十分简单。CyclistBarrier的使用也和上面十分相似。

信号量

主要用来控制并发量,也可以用来实现指定长度的队列。

下面用Semaphore来实现一个多线程变单线程的例子。

这是一个线程不安全的计数demo,由于多线程线程并发执行时的cpu执行时序影响,结果十分混乱。

3333.png

4444.png

可以用Semaphore使这个计数任务变成串行执行,把并发量设为1,同时只有一个线程执行计数操作。
5555.png

由于是单线程执行,自然就不存在线程安全问题了。(当然不推荐用这种方式解决线程安全问题,只是用来演示信号量工具类Semaphore的用法)

6666.png

原文地址:https://www.cnblogs.com/powerjiajun/p/11564169.html