基于 AQS 的并发编程: CountDownLatch 和 semaphore

Posted 小乔不掉发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于 AQS 的并发编程: CountDownLatch 和 semaphore相关的知识,希望对你有一定的参考价值。

1、CountDownLatch

  • 1、谈谈 CountDownLatch:

CountDownLatch 是 JDK 提供的一个同步工具,它可以让一个或多个线程等待,一直等到其他线程中执行完成一组操作

  • 2、CountDownLatch有哪些常用的方法?

有 countDown 方法和 await 方法,CountDownLatch在初始化时,需要指定用给定一个整数作为计数器。当调用 countDown 方法时,计数器会被减1;当调用 await 方法时,如果计数器大于0时,线程会被阻塞,一直到计数器被 countDown 方法减到0时,线程才会继续执行。计数器是无法重置的,当计数器被减到0时,调用await方法都会直接返回

  • 3、调用 countDown 方法时,线程也会阻塞嘛?

不会的,调用countDown的线程可以继续执行,不需要等待计数器被减到0,只是调用await方法的线程需要等待

  • 4、可以举一个使用CountDownLatch的例子吗?

比如张三、李四和王五几个人约好去饭店一起去吃饭,这几个人都是比较绅士,要等到所有人都到齐以后才让服务员上菜。这种场景就可以用到CountDownLatch

  • 5、CountDownLatch的实现原理是什么?

CountDownLatch有一个内部类叫做Sync,它继承了AbstractQueuedSynchronizer类,其中维护了一个整数state,并且保证了修改state的可见性和原子性

2、semaphore

  • 1、谈谈 semaphore:

Semaphore是JDK提供的一个同步工具,它通过维护若干个许可证来控制线程对共享资源的访问。 如果许可证剩余数量大于零时,线程则允许访问该共享资源;如果许可证剩余数量为零时,则拒绝线程访问该共享资源。 Semaphore所维护的许可证数量就是允许访问共享资源的最大线程数量。 所以,线程想要访问共享资源必须从Semaphore中获取到许可证

  • 2、Semaphore有哪些常用的方法?

有acquire方法和release方法。 当调用acquire方法时线程就会被阻塞,直到Semaphore中可以获得到许可证为止,然后线程再获取这个许可证。 当调用release方法时将向Semaphore中添加一个许可证,如果有线程因为获取许可证被阻塞时,它将获取到许可证并被释放;如果没有获取许可证的线程, Semaphore只是记录许可证的可用数量

  • 3、可以举一个使用Semaphore的例子吗?

张三、李四和王五和赵六4个人一起去饭店吃饭,不过在特殊时期洗手很重要,饭前洗手也是必须的,可是饭店只有2个洗手池,洗手池就是不能被同时使用的公共资源,这种场景就可以用到Semaphore

  • 4、Semaphore的内部原理:

Semaphore内部主要通过AQS(AbstractQueuedSynchronizer)实现线程的管理。Semaphore在构造时,需要传入许可证的数量,它最后传递给了AQS的state值。线程在调用acquire方法获取许可证时,如果Semaphore中许可证的数量大于0,许可证的数量就减1,线程继续运行,当线程运行结束调用release方法时释放许可证时,许可证的数量就加1。如果获取许可证时,Semaphore中许可证的数量为0,则获取失败,线程进入AQS的等待队列中,等待被其它释放许可证的线程唤醒。

以上是关于基于 AQS 的并发编程: CountDownLatch 和 semaphore的主要内容,如果未能解决你的问题,请参考以下文章

Java Review - 并发编程_抽象同步队列AQS

Java Review - 并发编程_抽象同步队列AQS

Java并发编程 JUC中的锁

Java并发编程- J.U.C之AQS及其相关组件详解

Java并发编程 AbstractQueuedSynchronizer的设计与实现

并发编程Java并发编程-看懂AQS的前世今生