1.Semaphore(信号量):
Semaphore用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量
2.如何理解semaphore?
网上有一段比较形象的解释:
理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,看见红灯就表示线程被阻塞,不能执行。
3.也可以这样理解:我们已经建好了一个厕所,他只有五个坑,现在有八个哥们想拉屎,只能有五个人能入坑,其他三个只能等,当坑内的某死鬼搞完提裤子了,你就可以上了。他们8个人在一开始的时候是如何竞争这5个坑呢?
Semaphore 有两种模式,公平模式 和 非公平模式。
- 公平模式就是调用 acquire 的顺序就是获取许可证的顺序,遵循 FIFO。
- 非公平模式是抢占式的,也就是有可能一个新的获取线程恰好在一个许可证释放时得到了这个许可证,而前面还有等待的线程。
4.代码示例:
package com.springboot.thread;
import java.util.concurrent.Semaphore;
/*线程通讯方式:以Semaphore的方式进行线程之间的互相通讯*/
/*Semaphore用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量*/
public class ThreadCommunication5 {
/*指定操作当前资源的线程数为1*/
Semaphore semaphore = new Semaphore(1);
public void incrementNum() {
try {
/*加锁*/
semaphore.acquire();
for (int i = 0; i < 5; i++) {
System.out.println("当前的线程是:"+Thread.currentThread().getName() + ",i=" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
/*释放锁*/
semaphore.release();
}
}
public static void main(String[] args) {
ThreadCommunication5 threadCommunication5 = new ThreadCommunication5();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
threadCommunication5.incrementNum();
}
},"thread1");
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
threadCommunication5.incrementNum();
}
},"thread2");
thread1.start();
thread2.start();
}
}
5.运行结果:
当前的线程是:thread1,i=0
当前的线程是:thread1,i=1
当前的线程是:thread1,i=2
当前的线程是:thread1,i=3
当前的线程是:thread1,i=4
当前的线程是:thread2,i=0
当前的线程是:thread2,i=1
当前的线程是:thread2,i=2
当前的线程是:thread2,i=3
当前的线程是:thread2,i=4
6.参考资料:
(1).https://www.jianshu.com/p/84ecd37a9604
(2).http://ifeve.com/tag/semaphore/
(3).https://www.cnblogs.com/iou123lg/p/9689491.html
(4).https://blog.csdn.net/hanchao5272/article/details/79780045