JUC:同步辅助类

java.util.concurrent 包下,有一些关于同步的辅助工具类,比如CountDownLatch、CyclicBarrier等。

CountDownLatch

允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。CountDownLatch允许创建时传入一个初始值,代表门闩的数量,cdl调用await方法进行阻塞;cdl通过 countDown() 方法拿掉一个门闩,直到门闩的数量变为0时,await阻塞结束。

public class CountDownLatchDemo {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch cdl = new CountDownLatch(5);
        for (int i = 0; i < 5; i++) {
            int finalI = i;
            new Thread(() -> {
                try {
                    Thread.sleep(finalI * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "执行完毕");
                cdl.countDown();
            }, "线程" + i).start();
        }
        cdl.await();
        System.out.println("所有门闩已经打开,继续执行main线程!");
    }

}

CyclicBarrier

Cyclic 循环的,Barrier 栅栏,屏障。类似满人发车,每凑满20人,才会继续执行,下面是使用示例:

CyclicBarrer 应用于多个线程并发执行,比如网络操作、文件操作同时执行;当所有线程都准备完毕,下面的操作才可进行。

Phaser

阶段执行,jdk7引入。多个线程执行一个任务,此任务分为多个阶段,每个阶段要求全部或者部分线程并发执行并且所有目标线程执行完毕后才可继续执行下一阶段的场景。比如达尔文遗传算法。下面使用Phaser对结婚场景进行模拟,结婚要按照阶段顺序依次执行,先到达、再拜堂、再吃酒席…:

执行结果如下:

Semaphore

Semaphore 是信号量的意思,也成为信号灯(红绿灯),用来保证两个或多个关键代码段不被并发调用;类似锁,但是可以限制并发线程的数量。常用于限流。

Exchanger

交换两个线程的信息(只能是两个线程)。

结果:

LockSupport

LockSupport 是比较低级的工具方法,不过使用起来也很方便,相比notify,它可以指定某个thread进行唤醒。

最后更新于

这有帮助吗?