文档章节

【java.util.concurrent】Semaphore详解

阿阿阿阿阿局
 阿阿阿阿阿局
发布于 2016/08/05 15:29
字数 566
阅读 53
收藏 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
java.util.concurrent系列之--Semaphore

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

来来来来来
2017/12/21
4
0

没有更多内容

加载失败,请刷新页面

加载更多

Idea

command + E : 打开最近编辑过的文件 command + O : 打开指定文件 option + enter: 补全变量 实现接口 格式化字符串 System.out.printf("realName:" + u.getRealName() + "email: " + u.get...

xpttxsok
15分钟前
0
0
FTP 协议 1.0

自己制作的FTP协议:

Explorer0
26分钟前
2
0
Android 通过DrawableInflater加载自定义Drawable

一、Drawable 在Android系统张,图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,因此系统提供了一个被称之为Drawable的类来进行绘制处理...

IamOkay
37分钟前
1
0
灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

yizhichao
43分钟前
1
0
Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部