简介
- 信号量,有时也被称为信号灯,是多线程模式下使用的一种设施,确保资源正确且合理的使用。
概念
- 分为两种,单值和多值,前者只能被一个线程获得,后者可以被多个线程获得
- 比如一个停车场,里面有三个停车位,这时来了五辆车,这时看门人只允许其中的三辆车进入,剩余的等待,在这里,车位属于资源,车辆属于线程,看门人就属于信号量,其中有等待和释放这两个操作,一次进入一个车辆,如果车位已满,则其他车辆进入等待状态,直至有车出去,释放停车位资源。
- java提供公平和非公平二种模式,公平是按顺序执行,不公平则有可能后面的排在队列头部前面,Semaphore(int permits, boolean fair),创建指定许可书和公平模式的Semaphore。
- Semaphore在多线程的情况下被扩放使用,在操作系统中是一个比较重要的概念,java并发库Semaphore可以轻松对信号量的控制,Semaphore可以控制某个公共资源同时被访问的个数,通过acquire()获取一个许可,通过release()释放。单个信号量Semaphore控制可用于互斥锁,由一个线程获得锁,再由另一个线程释放锁,可用于恢复死锁的一些场合。
- 示例:
/**
* 信号量
* @author 98543
*/
public class SignTest {
public static void main(String[] args) {
// 穿件线程池
ExecutorService es = Executors.newCachedThreadPool();
// 创建信号量,只允许5个线程通行
final Semaphore sh = new Semaphore(5,true);
for (int i = 0; i < 100; i++) {
int no = i;
Runnable run = new Runnable() {
public void run() {
try {
// 获取允许
sh.acquire();
System.out.println("No->"+no);
Thread.sleep((long) (Math.random()*1000));
// 释放
sh.release();
// sh.availablePermits() 获取可用信号灯数
System.out.println("---------------------"+sh.availablePermits());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
es.submit(run);
}
es.shutdown();
}
}