概念:
Semaphore是信号量,又称为信号灯,它可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制。
当Semaphore的个数变成1时,即代表只允许一个线程访问,这是Semaphore的功能就变成了Lock的功能。
它有两个核心方法:
- acquire() 获取一个许可,得到许可才能执行后面的代码,如果没有就等待。
- release() 释放一个许可。
实例:
给出这样一个实例:现有3个信号量,有6个线程去获取信号量,获取到就执行,没获取到就等待,直到有信号量被释放。
import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreDemo implements Runnable { Semaphore semaphore = new Semaphore(3); //创建三个信号量 @Override public void run() { try { semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "得到一个信号量"); try { Thread.sleep(new Random().nextInt(2000)); } catch (InterruptedException e) { e.printStackTrace(); } semaphore.release(); System.out.println(Thread.currentThread().getName() + "释放一个信号量"); } public static void main(String[] args) { SemaphoreDemo sd = new SemaphoreDemo(); ExecutorService service = Executors.newFixedThreadPool(6); while (true) { service.execute(sd); } } }
我们来看一下运行结果:
另外需要注意的一点:
信号灯可以由一个线程使用,然后由另一个线程来进行释放,而锁只能由同一个线程启动和释放,不然就好发生死锁。