多线程并发控制CountDownLatch和CyclicBarrier和Semaphore

来源:互联网 发布:淘宝确认收货时间 编辑:程序博客网 时间:2024/06/06 18:44

CountDownLatch:利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。

CyclicBarrier:字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。

Semaphore:翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

相同点

    ​都位于java.util.concurrent包下

    ​构造函数都需要指定多少个同步资源:

    ​    ​public CountDownLatch(int count) {  };  //参数count为计数值

   public CyclicBarrier(int parties) 

   public Semaphore(int permits) {          //参数permits表示许可数目,即同时可以允许多少线程进行访问

    ​接口使用也差不多

    ​举例CountDownLatch

public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public void countDown() { };  //将count值减1

    ​都是要手动lock,然后完成工作后unlock

不同点:

    ​应用上有差别,如图示

    ​

    ​

​欢迎感兴趣的码农关注我,目前研究方向为:搜索,智能问答等方向



阅读全文
0 0
原创粉丝点击