信号量

简介

  • 信号量,有时也被称为信号灯,是多线程模式下使用的一种设施,确保资源正确且合理的使用。

概念

  • 分为两种,单值和多值,前者只能被一个线程获得,后者可以被多个线程获得
  • 比如一个停车场,里面有三个停车位,这时来了五辆车,这时看门人只允许其中的三辆车进入,剩余的等待,在这里,车位属于资源,车辆属于线程,看门人就属于信号量,其中有等待和释放这两个操作,一次进入一个车辆,如果车位已满,则其他车辆进入等待状态,直至有车出去,释放停车位资源。
  • 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();
	}
}
原文地址:https://www.cnblogs.com/kungFuPander/p/11711717.html