文档章节

【java.util.concurrent】Semaphore详解

阿阿阿阿阿局
 阿阿阿阿阿局
发布于 2016/08/05 15:29
字数 566
阅读 38
收藏 0
点赞 0
评论 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 条记录,之后线程一直阻塞。

© 著作权归作者所有

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

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

职业搬砖20年 ⋅ 06/14 ⋅ 0

Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

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

明舞 ⋅ 2015/09/01 ⋅ 0

AbstractQueuedSynchronizer在工具类Semaphore、CountDownLatch、ReentrantLock中的应用和CyclicBarrier

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

pczhangtl ⋅ 2013/11/18 ⋅ 0

使用Semaphore限制资源并发访问的线程数

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

王孟君 ⋅ 2016/11/06 ⋅ 5

java.util.concurrent系列之--Semaphore

一、Semaphore用法 Semaphore ['seməfɔː] 信号 Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放...

来来来来来 ⋅ 2017/12/21 ⋅ 0

java中的 CountDownLatch

1、在java.util.concurrent包下 在java1.5被引入的 一起引入的并发工具类CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue 2、CountDownLatch 使一个线程等其他线程完成各自的工...

职业搬砖20年 ⋅ 05/29 ⋅ 0

Java程序员进化为架构师需要掌握的知识

Java程序员进化为架构师掌握的知识: 一:Java知识 1、进制转换 2、Java基本数据类型 面向对象相关知识 3、类、接口、抽象类 this关键字、static关键字、final关键字 方法的参数传递机制 Ja...

andogo ⋅ 2014/05/16 ⋅ 2

java阻塞队列的实现

阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直...

longbadx ⋅ 2014/06/09 ⋅ 0

并发辅助类CountDownLatch的使用和源码

CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他10个线程的任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现...

激情的狼王丶21 ⋅ 01/11 ⋅ 0

CSDN日报20170731——《程序员内部培训与个人发展杂谈》

程序人生 | 程序员内部培训与个人发展杂谈 作者:hursing 牛叉的技术可以带来优质的体验,好的体验吸引更多用户,用户规模引发的赚钱效应驱动更多资本和人力投入,投入带来经验总结,总结产出...

blogdevteam ⋅ 2017/07/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

20.zip压缩 tar打包 打包并压缩

6月25日任务 6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩 6.5 zip压缩工具: zip支持压缩目录 zip压缩完之后原来的文件不删除 不同的文件内容其实压缩的效果不一样 文件内有很多重复的用xz压...

王鑫linux ⋅ 4分钟前 ⋅ 0

double类型数据保留四位小数的另一种思路

来源:透析公式处理,有时候数据有很长的小数位,有的时候由在四位以内,如果用一般的处理方法,那么不足四位的小树会补充0到第四位,这样子有点画蛇添足的感觉,不太好看。所以要根据小数的...

young_chen ⋅ 11分钟前 ⋅ 0

Python 优化 回溯下降算法

使用sympy构造表达式,实现回溯下降算法 画出函数图像,先使用暴力搜索,找到最小值约为2.5左右 然后选定初始点,开始进行回溯搜索,下降方向为负梯度方向 下降的误差与步数大致呈现下面的状...

阿豪boy ⋅ 16分钟前 ⋅ 0

Django配置163邮箱出现 authentication failed(535)错误解决方法

最近用Django写某网站,当配置163邮箱设置完成后,出现535错误即:smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed') Django初始配置邮箱设置 EMAIL_HOST = "smtp.1...

陈墨轩_CJX ⋅ 17分钟前 ⋅ 0

用接口模拟可伸缩枚举(34)

1、枚举的可伸缩性最后证明都不是什么好点子 扩展类型的元素是基本类型实例,基本类型的实例却不是扩展类型的元素,很混乱 目前还没有很好的方法来枚举基本类型的所有元素,及其扩展 可伸缩性...

职业搬砖20年 ⋅ 21分钟前 ⋅ 0

Ubuntu18.04 IDEA快捷键无法使用

IDEA默认的回退到上一视图的快捷键是Ctrl + Alt + Left,在ubuntu中这个快捷键被占用了,在16.04中可以在界面中取消这个快捷键,但是18.04就看不到了,可以使用以下命令解决 gsettings set ...

Iceberg_XTY ⋅ 25分钟前 ⋅ 0

如何解决s权限位引发postfix及crontab异常

一、问题现象 业务反馈某台应用服务器,普通用户使用mutt程序发送邮件时,提示“postdrop warning: mail_queue_enter: create file maildrop/713410.6065: Permission denied”,而且普通用法...

问题终结者 ⋅ 37分钟前 ⋅ 0

Unable to load database on disk

由于磁盘空间满了以后,导致zookeeper异常退出,清理磁盘空间后,zk启动报错,信息如下: 2018-06-25 17:18:46,904 INFO org.apache.zookeeper.server.quorum.QuorumPeerConfig: Reading co...

刀锋 ⋅ 57分钟前 ⋅ 0

css3 box-sizing:border-box 实现div一行多列

<!DOCTYPE html><html><head><style> div.container{ background:green; padding:10px 10px;}div.box{box-sizing:border-box;-moz-box-sizing:border-box; /* Fir......

qimh ⋅ 今天 ⋅ 0

Homebrew简介和基本使用

一、Homebrew是什么 Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径...

说回答 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部