信号量:Semaphore
查看代码,可以对比ReentrantLock的源码一起看。
发现这俩个类代码好多是差不多的。
唯一不同的是:Semaphore的获取许可操作,一定条件下会触发唤醒后续线程尝试获取许可的操作。
还有就是,它是倒计数的方式。另外,如果我们一开始许可数设为1,其实就可以当做一个互斥的不可重入的锁的来使用。
下面是自己写的一个小demo,做线程交替输出。
import java.util.concurrent.Semaphore;
/*
* 线程通信,俩个线程交替打印
* 如:1A2B3C....
* 使用 信号量
*
*
* */
public class TestThread7 {
public static void main(String[] args) throws InterruptedException {
char[] a1 = "12345678".toCharArray();
char[] aa = "ABCDEFGH".toCharArray();
Semaphore sp1 = new Semaphore(1);
Semaphore sp2 = new Semaphore(1);
sp1.acquire();
new Thread(()->{
try {
for (int i = 0; i < a1.length; i++) {
sp2.acquire();
System.out.print(a1[i]);
sp1.release();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
}
},"t1").start();
new Thread(()->{
//线程2输出 A,B,C,D...
try {
for (int i = 0; i < aa.length; i++) {
sp1.acquire();
System.out.print(aa[i]);
sp2.release();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
}
},"t2").start();
}
}