宁波建网站哪家,互联网创业有哪些项目可以做,网站怎么做团购,五金网站制作这里写目录标题 1、ReentrantLock2、Semaphore3、CountDownLatch4、CyclicBarrier 1、ReentrantLock ReentrantLock 是属于独占模式#xff0c; 即同一时刻只允许一个线程获取锁。
2、Semaphore
Semaphore 属于共享模式#xff0c;synchronized 和 ReentrantLock 都是一次只… 这里写目录标题 1、ReentrantLock2、Semaphore3、CountDownLatch4、CyclicBarrier 1、ReentrantLock ReentrantLock 是属于独占模式 即同一时刻只允许一个线程获取锁。
2、Semaphore
Semaphore 属于共享模式synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源而Semaphore(信号量)可以用来控制同时访问特定资源的线程数量。 Semaphore 通常用于那些资源有明确访问数量限制的场景比如限流仅限于单机模式实际项目中推荐使用 Redis Lua 来做限流
Semaphore 的原理
3、CountDownLatch
CountDownLatch 允许 count 个线程阻塞在一个地方直至所有线程的任务都执行完毕。CountDownLatch 是一次性的计数器的值只能在构造方法中初始化一次之后没有任何机制再次对其设置值当 CountDownLatch 使用完毕后它不能再次被使用。
原理 CountDownLatch 是共享锁的一种实现,它默认构造 AQS 的 state 值为 count。当线程使用 countDown() 方法时,其实使用了tryReleaseShared方法以 CAS 的操作来减少 state,直至 state 为 0 。当调用 await() 方法的时候如果 state 不为 0那就证明任务还没有执行完毕await() 方法就会一直阻塞也就是说 await() 方法之后的语句不会被执行。直到count 个线程调用了countDown()使 state 值被减为 0或者调用await()的线程被中断该线程才会从阻塞中被唤醒await() 方法之后的语句得到执行
应用场景 读取处理 6 个文件这 6 个任务都是没有执行顺序依赖的任务但是我们需要返回给用户的时候将这几个文件的处理的结果进行统计整理。
为此我们定义了一个线程池和 count 为 6 的CountDownLatch对象 。使用线程池处理读取任务每一个线程处理完之后就将 count-1调用CountDownLatch对象的 await()方法直到所有文件读取完之后才会接着执行后面的逻辑。
public class CountDownLatchExample1 {// 处理文件的数量private static final int threadCount 6;public static void main(String[] args) throws InterruptedException {// 创建一个具有固定线程数量的线程池对象推荐使用构造方法创建ExecutorService threadPool Executors.newFixedThreadPool(10);final CountDownLatch countDownLatch new CountDownLatch(threadCount);for (int i 0; i threadCount; i) {final int threadnum i;threadPool.execute(() - {try {//处理文件的业务操作//......} catch (InterruptedException e) {e.printStackTrace();} finally {//表示一个文件已经被完成countDownLatch.countDown();}});}countDownLatch.await();threadPool.shutdown();System.out.println(finish);}
}4、CyclicBarrier
CyclicBarrier 和 CountDownLatch 非常类似它也可以实现线程间的技术等待但是它的功能比 CountDownLatch 更加复杂和强大。主要应用场景和 CountDownLatch 类似。
CountDownLatch 的实现是基于 AQS 的而 CycliBarrier 是基于 ReentrantLock(ReentrantLock 也属于 AQS 同步器)和 Condition 的。
原理 让一组线程到达一个屏障也可以叫同步点时被阻塞直到最后一个线程到达屏障时屏障才会开门所有被屏障拦截的线程才会继续干活。