文档章节

Java 信号量 Semaphore 介绍

凯文加内特
 凯文加内特
发布于 2016/04/20 08:29
字数 634
阅读 75
收藏 3

 Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。 

Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。

Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁 ReentrantLock 也可以实现该功能,但实现上要复杂些。 

下面的Demo中申明了一个只有5个许可的Semaphore,而有20个线程要访问这个资源,通过acquire()和release()获取和释放访问许可。

package class9;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

//实现一个网页,并限制并发

public class TestSemaphore {
	public static void main(String[] args) {
		// 线程池
		ExecutorService exec = Executors.newCachedThreadPool();
		// 限制只能5个线程同时访问
		final Semaphore semp = new Semaphore(5);
		// 模拟20个客户端访问
		for (int index = 0; index < 20; index++) {
			final int NO = index;
			Runnable run = new Runnable() {
				public void run() {
					try {
						// 获取许可
						semp.acquire();
						System.out.println("Accessing: " + NO);
						Thread.sleep((long) (Math.random() * 1000));

						System.out.println("-----------------" + semp.availablePermits());
					} catch (InterruptedException e) {
						e.printStackTrace();
					} finally {
						// 访问完后,释放
						semp.release();
					}
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();
	}
}

执行结果如下:

Accessing: 0
Accessing: 1
Accessing: 2
Accessing: 3
Accessing: 4
-----------------0
Accessing: 5
-----------------0
Accessing: 6
-----------------0
Accessing: 7
-----------------0
Accessing: 8
-----------------0
Accessing: 9
-----------------0
Accessing: 10
-----------------0
Accessing: 11
-----------------0
Accessing: 12
-----------------0
Accessing: 13
-----------------0
Accessing: 14
-----------------0
Accessing: 15
-----------------0
Accessing: 16
-----------------0
Accessing: 17
-----------------0
Accessing: 19
-----------------0
Accessing: 18
-----------------0
-----------------1
-----------------2
-----------------3
-----------------4


本文转载自:http://www.cnblogs.com/whgw/archive/2011/09/29/2195555.html

凯文加内特
粉丝 342
博文 703
码字总数 111087
作品 0
青岛
后端工程师
私信 提问
Smaphor(信号量)实现限流器

Semaphore信号量 在管程被提出来之前用的是信号量。 信号量模型 一个计数器,一个等待队列,三个方法。计数器和等待队列对外是透明的,所以只能通过信号量模型提供的三个方法来访问他们,这三...

刘一草
09/24
48
0
JUC锁框架——Semaphore

Semaphore简单介绍 Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一...

长头发-dawn
2018/09/17
31
0
PV操作和信号量机制实现进程同步(对多个临界资源的互斥访问)

进程同步是我们在多线程中讨论最多的一个话题,在大多数的开发语言中,他们都有自己实现进程同步的方法或者实现。但归根结底他们实现的方式都是基于操作系统的进程同步的方式。今天我们就一起...

长平狐
2012/11/12
824
0
Ignite.NET插件示例:分布式Semaphore(信号量)

Ignite.NET从2.0版本开始,引入了插件系统,插件可以仅在于.NET环境中,也可以在于.NET + Java混合环境中,本文会描述如何在后者实现插件。 为什么需要插件? Ignite.NET构建于Ignite(用Jav...

李玉珏
11/01
44
0
Java信号量_Semaphore

Java信号量_Semaphore 计数信号量(Counting Semaphore)用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。计数信号量还可以用来实现某种资源池,或者对容器施加...

秋风醉了
2014/11/18
175
1

没有更多内容

加载失败,请刷新页面

加载更多

Python 周刊第 418 期

新闻 PyCon US 2020 开始接受财务赞助! https://pycon.blogspot.com/2019/10/financial-aid-launches-for-pycon-us-2020.html2020年 Python 美国开发者大会,tips: 中国也有,可以赞助国内的...

iCodeBugs
7分钟前
1
0
ThreadLocal源码阅读

首先,从set方法入手, // ThreadLocalpublic void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t);//这里可以看出,从Threa......

小海bug
16分钟前
2
0
成长之路 万事知行合一

思想决定行为,行为决定习惯,习惯决定性格,性格决定命运。 很多道理,不管是前辈给你指点说的也好,还是你自己看一些书籍学到的也好,如果不能够做到,就连那些不知道这个道理的人都不如。...

T型人才追梦者
19分钟前
2
0
uml图六种箭头的含义

在看一些技术博客的时候,经常会见到博客里画上很多uml图。因为经常会被这几种表达关系的箭头搞混,这里我就把常见的6种箭头表达的含义理一下。 泛化 概念:泛化是一种一般与特殊、一般与具体...

1只特立独行的猪
26分钟前
2
0
【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[3]:自定义代币

原文作者:Xuejie 原文链接:https://xuejie.space/2019_09_06_introduction_to_ckb_script_programming_udt/ Nervos CKB 脚本编程简介[3]:自定义代币 CKB 的 Cell 模型和 VM 支持许多新的用...

NervosCommunity
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部