1.1 JUC是什么?
JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!
2.2 Semaphore(信号量)
Semaphore(信号量) 是一个计数信号量,它的本质是一个“共享锁“。信号量维护了一个信号量许可集。线程可以通过调用 acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。
下面我们还看一段小程序:
package JUC;
import java.util.concurrent.Semaphore;
/**
* @Description:
* @Author CHEN
* @Date 2022/7/9 0009
*/
public class SemaphoreTest {
public static void main(String[] args) {
Semaphore semaphore=new Semaphore(2);
for (int j = 0; j <3 ; j++) {
new Thread(()->{
try {
semaphore.acquire(); //可以设定参数指定许可证数量
System.out.println("get a license...");
Thread.sleep(100);
semaphore.release(); //可以设定参数指定许可证数量
System.out.println("release a license...");
} catch (InterruptedException exception) {
exception.printStackTrace();
}
}).start();
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 获取剩余许可证数量
System.out.println(semaphore.availablePermits());
// 是否有等待线程
System.out.println(semaphore.hasQueuedThreads());
// 等待线程数量
System.out.println(semaphore.getQueueLength());
}
运行结果:
get a license...
get a license...
0
true
1
release a license...
get a license...
release a license...
release a license...
Process finished with exit code 0
在程序中我只放了两个“通行证”,也就是说只有两个线程能够同时进入代码块,另外一个线程没有获取到信号量,就会处于阻塞状态。在以往的多线程案例中,我们一般只允许一个线程进入代码块,而Semaphore信号量可以帮助我们解决需要多个线程同时处理的问题。