Loading

并发工具类

  • CountDownLatch

    一组线程等待其他的线程完成工作以后在执行;

    await方法用来等待,countDown方法负责计数器的减一;

    计数器必须大于等于0,只是等于0的时候,计数器就是零,调用await方法时不会阻塞当前线程;CountDownLatch不可能重新初始化或修改CountDownLatch对象的内部计数器的值;

 

  • CyclicBarrier

    CyclicBarrier的字面意思是可循环使用的屏障;它要做的事情是,让一组线程到达一个屏障时被阻塞,直至最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行;

    CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier已经到达屏障,然后当前线程阻塞;

    CyclicBarrier(int parties, Runnable barrierAction),屏障开放,barrierAction定义的任务会执行;

 

  • CountDownLatch和CyclicBarrier区别

    CountdownLatch放行由外部调用countDown次数控制,CyclicBarrier放行由一组线程内部控制(调用await(方法)),一组线程可以包括如main线程或新创建的线程,需要在非同一线程内调用await()方法,也就是同一个线程重复调用await()方法是无效的;

   调用如下:

   java.util.concurrent.CyclicBarrier#dowait

   

 

   java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject#await(),AQS中ConditonObject会判断加入等待队列的节点是否在同步器的队列中,如果节点不在则调用LockSupport.park()方法将当前线程挂起;

   

 

 

 

 

 

     CountDownLatch的计数器只能使用一次,而CyclicBarrier得计数器可以使用reset()方法重置,CyclicBarrier可处理更复杂得业务场景;

 

 

  • Semaphore

    Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源;

    Semaphore的构造方法Semaphore(int permits) 接受一个整型数字,表示可用的许可证数量;Semaphore(10)表示允许10个线程获取许可证,也就是最大并发数为10;acquire()方法获取一个许可证,如果当前没有可用的许可证,则会阻塞直到有可用的许可证为止;tryAcquire()方法是尝试获取许可证,不会阻塞;

 

  • Exchanger

    Exchanger是一个用于线程间协作的工具类,用于进行线程间的数据交换;它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange()方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将生产出来的数据传递给对方;

 

posted @ 2020-04-14 00:31  街头卖艺的肖邦  阅读(147)  评论(0编辑  收藏  举报