Java 信号 Semaphore 简介
Semaphore当前在多线程环境下被扩放使用。操作系统的信号量是个非常重要的概念,在进程控制方面都有应用。
Java
并发库 的Semaphore 能够非常轻松完毕信号量控制,Semaphore能够控制某个资源可被同一时候訪问的个数,通过 acquire() 获取一个许可,假设没有就等待,而 release() 释放一个许可。比方在Windows下能够设置共享文件的最大client訪问个数。
Semaphore实现的功能就类似厕全部5个坑。假如有10个人要上厕所,那么同一时候仅仅能有多少个人去上厕所呢?同一时候仅仅能有5个人能够占用,当5个人中 的不论什么一个人让开后,当中等待的另外5个人中又有一个人能够占用了。另外等待的5个人中能够是随机获得优先机会,也能够是依照先来后到的顺序获得机会。这取决于构造Semaphore对象时传入的參数选项。单个信号量的Semaphore对象能够实现相互排斥锁的功能,而且能够是由一个线程获得了“锁”,再由还有一个线程释放“锁”,这可应用于死锁恢复的一些场合。
Semaphore维护了当前訪问的个数,提供同步机制,控制同一时候訪问的个数。在数据结构中链表能够保存“无限”的节点,用Semaphore能够实现有限大小的链表。另外重入锁 ReentrantLock 也能够实现该功能,但实现上要复杂些。
以下的Demo中申明了一个仅仅有5个许可的Semaphore。而有20个线程要訪问这个资源,通过acquire()和release()获取和释放訪问许可。
package com.test;
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个client訪问
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() * 10000));
// 訪问完后,释放
semp.release();
System.out.println("-----------------"+semp.availablePermits());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
exec.execute(run);
}
// 退出线程池
exec.shutdown();
}
}
运行结果例如以下:
Accessing: 0
Accessing: 1
Accessing: 3
Accessing: 4
Accessing: 2
-----------------0
Accessing: 6
-----------------1
Accessing: 7
-----------------1
Accessing: 8
-----------------1
Accessing: 10
-----------------1
Accessing: 9
-----------------1
Accessing: 5
-----------------1
Accessing: 12
-----------------1
Accessing: 11
-----------------1
Accessing: 13
-----------------1
Accessing: 14
-----------------1
Accessing: 15
-----------------1
Accessing: 16
-----------------1
Accessing: 17
-----------------1
Accessing: 18
-----------------1
Accessing: 19
版权声明:本文博主原创文章。博客,未经同意不得转载。
Java 信号 Semaphore 简介的更多相关文章
- Semaphore简介
Semaphore简介 Semaphore是并发包中提供的用于控制某资源同时被访问的个数 操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完 ...
- Java - "JUC" Semaphore源码分析
Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例 Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了 ...
- Java锁--Semaphore
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个&quo ...
- java.util.concurrent简介
文章目录 主要的组件 Executor ExecutorService ScheduledExecutorService Future CountDownLatch CyclicBarrier Sem ...
- [java] jsoup使用简介-汇率换算器实现-插曲2
[java] jsoup使用简介-汇率换算器实现-插曲2 // */ // ]]> [java] jsoup使用简介-汇率换算器实现-插曲2 Table of Contents 1 系列文章 ...
- Java Servlet 技术简介
Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...
- Java基础类库简介
Java基础类库简介 一.常用的基础类库:11个jar(Java Archive,Java归档)包 作为java语言使用者,我们可以感受到java语言带来的优势(平台无关.面向对象.多线程.高效易扩展 ...
- Java多线程概念简介 多线程中篇(一)
Java的线程与操作系统的线程 在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...
- Java编译器API简介
今天给大家分享的是Java编译器API简介,文章部分内容摘自[优锐课]学习笔记. Java编译器API Java编译器API是Java模块(称为java.compiler)的一部分.该模块包括语言模型 ...
随机推荐
- IBM AIX Shell编写遭遇错误一2
在IBM AIX 5.3平台上,编写一个shell的时候遇到几个错误. 0. exp: 0403-027 The parameter list is too long 看这个提示是说命令行长度太长了, ...
- 【android自己定义控件】自己定义View属性
1.自己定义View的属性 2.在View的构造方法中获得我们自己定义的属性 3.重写onMesure 4.重写onDraw 3这个步骤不是必须,当然了大部分情况下还是须要重写的. 1.自己定义Vie ...
- css实现自适应屏幕高度
body,html{ margin:0px; height:100%; }
- sql server 行列互转
1 列转行 测试脚本 ),课程 ),分数 int) ) ) ) ) ) ) go 转化脚本 select 姓名 , end) 语文, end) 数学 , end) 物理 from tb group b ...
- async和await用法
原文:async和await用法 要理解async和await的用法,首先要了解Task相关知识,这里不做说明,因为这不是本文的重点. 如果你已经对Task很了解,那么如何使用async和await, ...
- Java虚拟机几个命令行参数说明
一.运行class文件 执行带main方法的class文件,Java虚拟机命令参数行为: java <CLASS文件名> 注意:CLASS文件名不要带文件后缀.class 例如: java ...
- matlab 2014a 改为英文版本号
1. 在 Matlab 的安装目录以下找到例如以下的路径,X:\MATLAB\R2014a\java\jar,当中 X 为安装盘符,这个不用过多解释了,然后找到目录 zh_CN.此目录就是中文界面的语 ...
- python学习笔记之四:条件,循环和其他语句
前面已经介绍过几种基本语句(print,import,赋值语句),下面我们来介绍条件语句,循环语句. 一. print和import的更多信息 1.1 使用逗号输出 A.打印多个表达式,用逗号隔开,会 ...
- eclipse 重构(转)
Eclipse中的重构类型 如果你看一下Eclipse的重构菜单,可以看到四部分.第一部分是撤销和重做.其他的三部分包含Eclipse提供的三种类型的重构. 第一种类型的重构改变代码的物 ...
- 潜水JVM
原文地址:http://blog.jamesdbloom.com/JVMInternals.html(转载请注明出处和本文地址英文原文) 本文简要解析JVM的内部结构.下图显示了一个典型的一块JVM( ...