Loading

Java并发学习之同步工具类

一.同步工具类概述

1.什么是同步工具类?
同步工具类可以是任何一个对象,只要他可以根据其自身的状态来协调线程的控制流。
例如:
阻塞队列可以作为同步工具类,还有其它的同步工具类:信号量(Semaphore),栅栏(Barrier),闭锁(Latch)。

在java类库中还包括一些其他的同步工具类,如果这些类无法满足我们的需求,我们可以通过某种机制创建自己的同步工具类。

2.同步工具类的结构化属性:
1)它们封装了一些状态,这些状态将决定执行同步工具类的线程是继续执行还是等待。
2)它们还提供了一些方法可以对状态进行操作。
3)也提供了一些方法用于高效地等待同步工具类进入到预期状态。

二.闭锁

1.闭锁概述
闭锁的作用是延迟线程的执行直到这个锁达到终止状态。

通俗来说:闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭的,并且任何线程不能通过,当闭锁达到结束状态时,这扇门将会打开允许所有线程通过。

当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开。

2.闭锁的应用场景:
1)确保某个计算在其需要的所有资源都被初始化之后才继续执行。二元闭锁可以用来表示“资源R已经被初始化” ,而所有需要R的操作都必须先在这个闭锁上等待。

2)确保某个服务在依赖的所有其他服务都已经启动之后再启动。每个服务都有一个相关的二元闭锁,当启动服务S时,将首先在S依赖的其他服务的闭锁上等待,在所有依赖的服务都启动后会释放闭锁S,这样其他依赖S的服务才能继续执行。

3)等待直到某个操作的所有参与者都就绪后再继续执行。例如在多玩家游戏中的所有玩家,当所有玩家都准备就绪后,闭锁到达结束状态。

3.CountDownLatch
1)CountDownLatch是一种灵活的闭锁实现,它可以使一个或多个线程等待一组事件发生。它的闭锁状态包括一个计数器,该计数器会被初始化为一个正数来表示需要等待的事件数量。

2)countDown方法会递减计数器,表示有一个事件已经发生。

3)await方法等待计数器到达0,这表示所有需要等待的事件都已经发生,如果计数器的值不为0,那么await会一直阻塞直到计数器为0,或者其他异常发生。

使用实例:

public class TestHarness{
   
  public long timeTasks(int nThreads , final Runnable task) throws
   InterruptedException{
   
      final CountDownLatch startGate = new CountDownLatch(1);
      final CountDownLatch endGate = new CountDownLatch(nThreads);
      
      for(int i=0;i<nThreads;i++){
   
        Thread t = new Thread(){
   
            public void run(){
   
             try{
   
                 startGate.await();//它让所有新建的线程都保持等待状态
                 try{
   
                  task.run();
                 }finally{
   
                     endGate.countDown();//endGate减一操作
                 }
             }catch(InterruptedException ignored){
   }
            }
        };
        t.start();
      }
      
      long start = System.nanaTime();//记录开始时间
      startGate
posted @ 2020-11-14 14:07  文牧之  阅读(45)  评论(0)    收藏  举报  来源