使用同步工具类
闭锁
在线程执行过程中用一把锁把门锁住,在开锁之前线程无法通过这道门,只有当满足了开锁的条件之后,锁才会自动打开。
常用的闭锁工具类:CountDownLatch、CyclicBarrier、FutureTask。
闭锁应用场景
1.有a、b、c三个线程一起执行,可是a线程需要等待b、c线程任务执行完毕才继续往下执行。
2.一个线程的某步计算依赖于其它线程的执行结果。
用生活例子举例,小明约小张和小李吃饭,小明先到了,可是要等到小张和小李都到齐才能开始点菜吃饭,小明到饭店后等待小张小李到齐的这个步骤就是一个闭锁,小张和小李到齐是闭锁的两个开锁条件,只有满足了开锁条件,才能够继续点菜吃饭,否则只能干坐着等待。
输出结果:
以上demo便完成了一个闭锁的使用,十分简单。CyclistBarrier的使用也和上面十分相似。
信号量
主要用来控制并发量,也可以用来实现指定长度的队列。
下面用Semaphore来实现一个多线程变单线程的例子。
这是一个线程不安全的计数demo,由于多线程线程并发执行时的cpu执行时序影响,结果十分混乱。
可以用Semaphore使这个计数任务变成串行执行,把并发量设为1,同时只有一个线程执行计数操作。
由于是单线程执行,自然就不存在线程安全问题了。(当然不推荐用这种方式解决线程安全问题,只是用来演示信号量工具类Semaphore的用法)