在现实时间,不仅仅只有分工,还有协作,当异步执行的任务到了一定的阶段之后,还需要跟其他异步任务进行同步,这样才能开始下一个阶段的任务,Java在异步任务之间的协调或者同步机制上也提供了很多手段。按照介绍的顺序,提供的协调的灵活度越来越高。
一、Join
join是Thread类型的一个方法,是一个简单的用来在同步的机制,如果在主线程中调用A线程的join方法,则主线程会阻塞在调用点上,等等A线程的执行结束。如果主线程需要和多个同步参与方进行同步操作,进行多个线程的join操作虽然是可以的,但毕竟不优美,下面的同步机制或许更好用。
二、Wait Notify NotifyAll
这三个方法都是Object类型的方法,每一个同步参与方都可以在获得同步对象锁的前提下,调用同步对象的wait方法进行等待,但wait方法会让渡出cpu的使用权并释放同步对象锁,而notify和notifyALL也都需要在获得同步对象锁的前期下调用,他们虽然都是唤醒某个调用了wait方法的同步参与方,但一般建议使用notifyAll,因为他是唤醒所有的等待同步参与方,然后大家再去争抢锁,而notify则只会唤醒某一个同步参与方。
总有人会问,为什么这三个方法是在Object类型中,而不是在Thread类型中,因为他的使用场景是在同步对象中,而同步对象是个普遍意义上的对象,显然就应该Object中。
三、CountDownLatch
CountDownLatch在有多个同步参与方的时候很好用,比如同样的场景,主线程中需要等待5个同步参与方,如果用join,一则代码不好看,二则在线程池中无法使用,这里就可以使用CountDownLatch来做同步,构建一个有5个参与方的CountDownLatch对象,在每个同步参与方完成自己的任务后,调用CountDownLatch对象的countDown方法,而在主线程中可以调用await方法来进行等待,一旦所有的5个参与方都调用了countDown方法,则主线程就可以继续同步后的工作。
四、CyclicBarrier
CyclicBarrier在用法上和CountDownLatch很相似,但他又有自己的几个特点:
五、Phaser
Phaser是在java 1.7中才引入的一个同步barrier,它非常的灵活好用。
原文:https://www.cnblogs.com/029zz010buct/p/12182082.html