1. Semaphore定义
个人理解:同一时间内,限制指定数量线程通过
2. Semaphore的同步性
|
|
类Semaphore的构造函数permits可以理解为同时刻通过的线程许可数,代表同一时间内最多允许多少个线程同时执行
acquire()和release()之间的代码
eg: 无参方法的作用是使用1个许可
|
|
print:
可以看到打印信息依次输出,如果给为1个许可相当于这一段的时候是单线程的
我们改改: private Semaphore semaphore = new Semaphore(2);
print:
这个打印结果说明同一时刻是有0跟1两个线程通过acquire()和release()之间的
3. Semaphore实现生产者、消费者
Semaphore实现生产者、消费者模式的话还是比较简单的
我们以厨师、顾客来进行模拟这样一个场景,废话不多说,直接上代码:
启动类Run.java
线程类ThreadP.java
ReentrantLock跟Condition大家不明白的先自行度娘,后面我抽空再补上,emmmm…
ReentrantLock在这里再做一重锁的判断,确保生产者跟消费者都是平衡的
如果不加ReentrantLock会怎么样,因为我们是用的Condition进行一个相互唤醒的操作,不用ReentrantLock的话可能会报IllegalMonitorStateException的异常
输出的话就给大家截个图:
4.总结
Semaphore semaphore = new Semaphore(1)其实只是初始化多少个许可
acquire()相当于动态的减少许可,相应的release()可以动态的增加许可
Semaphore提供的限制并发线程的功能,此功能在默认的synchronized种是不提供的
源码地址
源码在thread目录下,还有一些其他demo,大家可自行学习