JAVA 多线程同步工具类总结
这两天看了《JAVA 并发编程实战》一书,内容很不错,关于同步常用的几个工具类总结如下:
CountDownLatch 闭锁:可以延迟线程的进度,直到锁到达终止状态。闭锁的作用相当于一扇门,在锁到达终止状态之前这扇门一直是关闭的。当锁到达终止状态时,允许所有线程通过。CountDownLatch 有一个初始值,通过调用 countDown 可以减少该值,一直到 0 时到达终止状态。CountDownLatch 的例子:
import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;public class DemoOfBarrier {public static void main(String[] args) {final int numOfThread = 2;final int numOfIteration = 2;// 创建一个用于线程同步的 Barrier 对象final CyclicBarrier barrier = new CyclicBarrier(numOfThread,new Runnable() {// 当所有线程到达 Barrier 后会执行这个任务// 任务在第一个 到达 Barrier 的线程中执行@Overridepublic void run() {long tid = Thread.currentThread().getId();// 当所有线程完成一轮迭代之后做点清除/准备/提交工作System.out.printf("[%d] - All threads arrived barrier...%n", tid);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.printf("[%d] - Clear work done...%n", tid);}});// 创建并启动多个线程,他们在 Barrier 上同步for (int i = 0; i < numOfThread; i++) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {long tid = Thread.currentThread().getId();for ( int k=0; k<numOfIteration; k++ ) {try {// 线程进行一轮迭代,做点事情System.out.printf("Thread %d start its work...%n", tid);long duration = (int)(Math.random()*5000);Thread.sleep(duration);// 做完迭代后等待其他线程完成迭代System.out.printf("Thread %d wait on barrier...%n", tid);int num = barrier.await();// 显示完成的顺序System.out.printf("Thread %d pass barrier with order=%d...%n", tid, num);} catch (InterruptedException e) {e.printStackTrace();Thread.currentThread().interrupt();} catch (BrokenBarrierException e) {e.printStackTrace();}}}});thread.start();}}}