文档章节

【java.util.concurrent】Semaphore详解

阿阿阿阿阿局
 阿阿阿阿阿局
发布于 2016/08/05 15:29
字数 566
阅读 43
收藏 0

概念:

一个计数信号量,信号量维护了一个许可集。Semaphore 只对可用许可的号码进行计数,并采取相应的行动。拿到信号量的线程可以进入代码,否则就等待。通过acquire()和release()获取和释放访问许可。

  • acquire():获取从这个信号量许可证,阻塞直到有一个可用,或线程被中断。
  • release() :释放一个许可,将可用的许可数增加 1。如果任意线程试图获取许可,则选中一个线程并将刚刚释放的许可给予它。

验证示例:

public class SemaphoreTest {
	private static int MAX_VALUE = 5;
	private static List<Integer> list = new LinkedList<Integer>();
	private static Map<Integer, Integer> map = new HashMap<Integer, Integer>();
	
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		/* Semaphore可以控制某个资源可被同时访问的个数
		 * 
		 * Semaphore(int permits)
		 * Semaphore(int permits, boolean fair)
		 *
		 * permits 初始许可数,也就是最大访问线程数
		 * fair 当设置为false时,线程获取许可的顺序是无序的,也就是说新线程可能会比等待的老线程会先获得许可;
		 * 当设置为true时,信号量保证它们调用的顺序(即先进先出;FIFO)
		 */
		Semaphore semaphore = new Semaphore(MAX_VALUE, true);
		ExecutorService es = Executors.newCachedThreadPool();//Executor接口拥有execute方法,ExecutorService继承Executor
		for(int i=0; i<4*MAX_VALUE; i++){
			//内部类访问成员变量,若局部变量不修改的情况下可以省去final关键字,since1.8;若改变,编译器将提示局部变量必须为final类型
			final int index = i;
			es.execute(new PRunnable(semaphore, index));
		}
		Thread.sleep(300);
		//退出线程池
		es.shutdown();
		System.out.println("最后还有"+semaphore.availablePermits()+"个许可可用");
	}
}

class PRunnable implements Runnable{
	private final Semaphore semaphore;
	private int index;
	
	public PRunnable(Semaphore semaphore, int index){
		this.semaphore = semaphore;
		this.index = index;
	}
	
	public void getAcquire(){
		System.out.println(index+"号车进入");
	}
	
	public void releaseAcquire(){
		System.out.println(index+"号车离开");
	}
	
	@Override
	public void run() {
		try {
			//acquire() 获取从这个信号量许可证,阻塞直到有一个可用,或线程被中断。
			semaphore.acquire();
			getAcquire();
			//release() 释放一个许可,将可用的许可数增加 1。如果任意线程试图获取许可,则选中一个线程并将刚刚释放的许可给予它。
			semaphore.release();
			releaseAcquire();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

 如果屏蔽semaphore.release()语句,则在控制台只能打印 MAX_VALUE 条记录,之后线程一直阻塞。

© 著作权归作者所有

共有 人打赏支持
阿阿阿阿阿局
粉丝 10
博文 48
码字总数 61219
作品 0
成都
java 中的Semaphore(信号量)

1、Semaphore可以控同时访问的线程个数 2、Semaphore类位于java.util.concurrent包下,它提供了2个构造器: 3、重要方法,acquire()、release()方法: acquire()用来获取一个许可,若无许可能...

职业搬砖20年
06/14
0
0
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

Java并发编程:CountDownLatch、CyclicBarrier和Semaphore   在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们...

明舞
2015/09/01
0
0
java多线程--信号量Semaphore的使用

  Semaphore可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制.例如控制某一个文件允许的并发访问的数量.   例如网吧里有100台机器,...

冬至饮雪
2016/04/06
0
0
AbstractQueuedSynchronizer在工具类Semaphore、CountDownLatch、ReentrantLock中的应用和CyclicBarrier

在上篇文章本人粗略地整理了AbstractQueuedSynchronizer和ReentrantLock的源码要点。其实,在java.util.concurrent包中,AbstractQueuedSynchronizer的应用非常广泛,而不局限于在Reentrant...

pczhangtl
2013/11/18
0
0
使用Semaphore限制资源并发访问的线程数

从JDK 1.5之后,在java.util.concurrent包下引入了好多的处理多线程的工具类,本文将介绍用来控制资源同时访问个数的Semaphore工具类, 然后采用Semaphore给出一个泊车的实例,最后给出Semapho...

王孟君
2016/11/06
919
5

没有更多内容

加载失败,请刷新页面

加载更多

Flask 开发填坑

插件的选择: flask-security 真的是个鸡肋啊。自带的页面,好丑。还不如用flask-login来做呢。

pearma
53分钟前
2
0
讲述下 :LVM逻辑卷管理遇到的问题

LVM学习逻辑卷管理创建逻辑卷遇到的问题 1 实验环境 系统 内核 发行版本 CentOS 2.6.32-754.2.1.el6.x86_64 CentOS release 6.10 (Final) 由于是最小化安装没有xfs命令,yum安装如下包支持此...

linuxprobe16
今天
1
0
day95-20180922-英语流利阅读-待学习

Hey Jude 半个世纪传唱不衰的背后故事 毛西 2018-09-22 1.今日导读 2004 年,The Beatles 被《滚石》杂志选为“历史上最伟大的 50 位流行音乐家的第一位”。这四名来自英国利物浦的男孩不仅对...

飞鱼说编程
今天
3
0
OSChina 周六乱弹 —— 放假前期焦虑症晚期

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享Matteo的单曲《Panama》: 《Panama》- Matteo 手机党少年们想听歌,请使劲儿戳(这里) @新垣吉衣OSC :我发现只要去有小朋友...

小小编辑
今天
325
10
wait()被notify()后,接着执行wait()后面的语句

wait()被notify()后,接着执行wait()后面的语句

noteman
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部