1、CountDownLatch 减法计数器
CountDownLatch 作为计数器使用,顾名思义,是做 - - 的计数器。
在必须要执行某些任务的时候使用此辅助。
如下图可见,未等待计数器归零,则有可能出现有的学生还没出去就已经关门了。
解决办法就是添加一个await()等待该计数器归零。在执行其他操作。
原理:
count.countDown();//计数器-1操作
count.await();//等待计数器归零,在执行下面操作
每次有线程调用countDown()数量-1,假设计数器变为0,count.await()就会被唤醒,继续执行。
2、CyclicBarrier 加法计数器
原理:
new CyclicBarrier(int temp,Runnable) 当计数器达到temp之后执行Runnable内容
barrier.await();每个线程执行完之后计数器+1,直到加到temp之后,运行Runnable内容
当所以执行的线程数量<temp时,则程序一直处于等待状态。
3、SemaPhore 信号量
约定一个线程数量,超出的线程部分等待,运行的线程结束之后,等待的线程在进入执行操作。
semaphore.acquire();//获取得到 加入线程约定的数量已经满了,那么其他线程在外面等待,等待里面的线程被释放。 相当于-1操作 得到之后,按上面例子来说,就是剩余的停车位-1
semaphore.release();//释放 会将当前信号量释放。然后唤醒等待的线程。 相当于+1操作 释放之后,按上面例子来说,就是剩余的停车位+1
作用:多个共享资源互斥的使用。
并发限流,控制最大的线程数。