CyclicBarrier 栅栏机制
CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
示例代码:
@Test
public void testCyclicBarrier() throws Exception{
//J.U.C并发编程 栅栏机制
CyclicBarrier cyclicBarrier = new CyclicBarrier(20000);
for (int i = 0; i < 20000; i++) {
new Thread(()->{
try {
System.out.println("我已经进来啦,查询商品");
cyclicBarrier.await(); //等待,栅栏拦住线程,等待栅栏开启,2000线程执行此段代码
Spu spu = spuMapper.selectByPrimaryKey("1335518444044419072");
System.out.println("已经查到商品啦,商品名"+spu.getName());
}catch (Exception e){
e.printStackTrace();
}
}).start();
}
System.in.read(); //不关闭程序
}
输出结果
我已经进来啦,查询商品
我已经进来啦,查询商品
我已经进来啦,查询商品
我已经进来啦,查询商品
我已经进来啦,查询商品
2020-12-28 17:34:49.854 INFO 42876 --- [ Thread-8] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-12-28 17:34:49.857 WARN 42876 --- [ Thread-8] com.zaxxer.hikari.util.DriverDataSource : Registered driver with driverClassName=com.mysql.jdbc.Driver was not found, trying direct instantiation.
2020-12-28 17:34:50.597 INFO 42876 --- [ Thread-8] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
已经查到商品啦,商品名智能手机
已经查到商品啦,商品名智能手机
已经查到商品啦,商品名智能手机
已经查到商品啦,商品名智能手机
已经查到商品啦,商品名智能手机
api
| 方法摘要 | |
|---|---|
int |
await() 在所有 参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。 |
int |
await(long timeout, TimeUnit unit) 在所有 参与者都已经在此屏障上调用 await 方法之前,将一直等待。 |
int |
getNumberWaiting() 返回当前在屏障处等待的参与者数目。 |
int |
getParties() 返回要求启动此 barrier 的参与者数目。 |
boolean |
isBroken() 查询此屏障是否处于损坏状态。 |
void |
|
| 构造方法摘要 | |
|---|---|
CyclicBarrier(int parties) 创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在每个 barrier 上执行预定义的操作。 |
|
CyclicBarrier(int parties, Runnable barrierAction) 创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行 |
|
与CountDownLatch的区别
CountDownLatch是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,再继续执行。
CyclicBarrier是一个同步的辅助类,允许一组线程相互之间等待,达到一个共同点,再继续执行。

浙公网安备 33010602011771号