java 多线程同步工具

CyclicBarrier 循环等待只有三个都满足才继续执行
public static void main(String[] args) {
   ExecutorService service = Executors.newCachedThreadPool();
   final  CyclicBarrier cb = new CyclicBarrier(3);
   for(int i=0;i<3;i++){
      Runnable runnable = new Runnable(){
            public void run(){
            try {
               Thread.sleep((long)(Math.random()*10000)); 
               System.out.println("线程" + Thread.currentThread().getName() + 
                     "即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));                 
               cb.await();
               
               Thread.sleep((long)(Math.random()*10000)); 
               System.out.println("线程" + Thread.currentThread().getName() + 
                     "即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
               cb.await();    
               Thread.sleep((long)(Math.random()*10000)); 
               System.out.println("线程" + Thread.currentThread().getName() + 
                     "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));                   
               cb.await();                   
            } catch (Exception e) {
               e.printStackTrace();
            }           
         }
      };
      service.execute(runnable);
   }
   service.shutdown();
}

CountDownLatch  计数器 , count减到0 await自动唤醒

public static void main(String[] args) {
   ExecutorService service = Executors.newCachedThreadPool();
   final CountDownLatch cdOrder = new CountDownLatch(1);
   final CountDownLatch cdAnswer = new CountDownLatch(1);    
   for(int i=0;i<3;i++){
      Runnable runnable = new Runnable(){
            public void run(){
            try {
               System.out.println("线程" + Thread.currentThread().getName() + 
                     "正准备接受命令");                   
               cdOrder.await();
               System.out.println("线程" + Thread.currentThread().getName() + 
               "已接受命令");                       
               Thread.sleep((long)(Math.random()*10000)); 
               System.out.println("线程" + Thread.currentThread().getName() + 
                     "回应命令处理结果");                  
               cdAnswer.countDown();                 
            } catch (Exception e) {
               e.printStackTrace();
            }           
         }
      };
      service.execute(runnable);
   }     
   try {
      Thread.sleep((long)(Math.random()*10000));
   
      System.out.println("线程" + Thread.currentThread().getName() + 
            "即将发布命令");                
      cdOrder.countDown();
      System.out.println("线程" + Thread.currentThread().getName() + 
      "已发送命令,正在等待结果");   
      cdAnswer.await();
      System.out.println("线程" + Thread.currentThread().getName() + 
      "已收到所有响应结果");  
   } catch (Exception e) {
      e.printStackTrace();
   }           
   service.shutdown();

}

 

CopyOnWriteArrayList:CopyOnWriteArrayList这是一个ArrayList的线程安全的变体,其原理大概可以通俗的理解为:初始化的时候只有一个容器,很常一段时间,这个容器数据、数量等没有发生变化的时候,大家(多个线程),都是读取(假设这段时间里只发生读取的操作)同一个容器中的数据,所以这样大家读到的数据都是唯一、一致、安全的,但是后来有人往里面增加了一个数据,这个时候CopyOnWriteArrayList 底层实现添加的原理是先copy出一个容器(可以简称副本),再往新的容器里添加这个新的数据,最后把新的容器的引用地址赋值给了之前那个旧的的容器地址,但是在添加这个数据的期间,其他线程如果要去读取数据,仍然是读取到旧的容器里的数据。


参考:
原文:https://blog.csdn.net/hua631150873/article/details/51306021 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值