多线程-信号量Semaphore
计数信号量用来控制同时访问某个特定资源的操作数量。Semaphore可以用于实现资源池,例如数据库连接池。我们可以构造一个固定长度的资源池,当资源池为空的时候,请求资源将会阻塞,而不是失败。当资源池非空的时候解除阻塞。如果将Semaphore的计数值初始化为池的大小,在池中获取一个资源之前首先调用Semopore.acquire()方法获取一个许可,当池为空的时候将阻塞到池非空为止。使用完毕的时候,调用Semophore.release()方法释放许可。
信号量好比现在厕所就有5个坑,等待上厕所的人数为10。因为每次只能同时5个人占用坑,所以其他10人必须等待,直到5个人中有一个人使用完,另外10个人中的一人才能去使用坑,以此类推。下面用代码模拟以下,如下:
package semaphore.semaphore; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; public class SemaphoreDemo { public static void main(String[]args){
//线程池
ExecutorService exec=Executors.newCachedThreadPool();
//初始化信号量
final Semaphore semaphore=new Semaphore(5);
//开启10个线程
for(int i=1;i<=10;i++){
final int num=i;
Thread thread=new Thread(new Runnable() {
public void run() {
try {
//获取许可
semaphore.acquire();
System.out.println("Accessing:"+num);
Thread.sleep((long) (Math.random()*10000));
//访问完毕释放
semaphore.release();
System.out.println("----------"+num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
exec.execute(thread);
}
exec.shutdown();
}
}
运行结果如下:

参考地址:JAVA并发编程实战
http://www.cnblogs.com/whgw/archive/2011/09/29/2195555.html
多线程-信号量Semaphore的更多相关文章
- 多线程信号量 Semaphore使用
对信号量只能实施三种操作: 1. 初始化(initialize),也叫做建立(create) 2. 等信号(wait),也可叫做挂起(pend) 3. 给信号(signal)或发信号(post) ...
- java多线程--信号量Semaphore的使用
Semaphore可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制.例如控制某一个文件允许的并发访问的数量. 例如网吧里有100台机器,那么最多只能提 ...
- C#多线程--信号量(Semaphore)
百度百科:Semaphore,是负责协调各个线程, 以保证它们能够正确.合理的使用公共资源.也是操作系统中用于控制进程同步互斥的量. Semaphore常用的方法有两个WaitOne()和Releas ...
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <且不超过最大资源数量. 第三个參数能够用来传出先前的资源计数,设为NULL表示不须要传出. 注意:当 ...
- 多线程面试题系列(8):经典线程同步 信号量Semaphore
前面介绍了关键段CS.事件Event.互斥量Mutex在经典线程同步问题中的使用.本篇介绍用信号量Semaphore来解决这个问题. 首先也来看看如何使用信号量,信号量Semaphore常用有三个函数 ...
- 转---秒杀多线程第八篇 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- Java多线程-新特征-信号量Semaphore
简介信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确.合理的使用公共资源. 概念Semaphore分为单值和多值两种,前者只能 ...
- 并发编程~~~多线程~~~守护线程, 互斥锁, 死锁现象与递归锁, 信号量 (Semaphore), GIL全局解释器锁
一 守护线程 from threading import Thread import time def foo(): print(123) time.sleep(1) print('end123') ...
- Java基础教程:多线程基础(6)——信号量(Semaphore)
Java基础教程:多线程基础(6)——信号量(Semaphore) 信号量 信号量(Semaphore)由一个值和一个指针组成,指针指向等待该信号量的进程.信号量的值表示相应资源的使用情况.信号量S≥ ...
随机推荐
- linux时间格式化
echo `date +'[%Y-%m-%d %H:%M:%S]'`
- jCarousel.js 插件
轮播图 中间放大 内容跟着切换 (参考 米趣 网站) html <div class="jcarousel-wrapper"> <div class=&quo ...
- Windows File 管理工具:junction And Subinacl
junction.exe 是 Sysinternals 出品的命令行工具.使用前建议将其复制到%SystemRoot%/system32目录下 创建一个名为 D:/LINK 的[junction ...
- 安装Vmware ESX Server5.5 ——hardware virtualization is not a feature of the cpu or is not enabled in the BIOS
Error信息: hardware virtualization is not a feature of the cpu or is not enabled in the BIOS 解决方案: F2进 ...
- navicat 中执行sql脚本 喊中文错误
执行内容和上篇一样,只是换了工具. 执行成功,但是数据库对应中文没有内容. sql脚本的编码是asci 执行的时候选择gbk 编码
- json.dumps 和 json.dump的区别,load和loads的区别
json.dumps 和 json.dump的区别,load和loads的区别
- Vue(4)- 获取原生的DOM的方式、DIY脚手架、vue-cli的使用
一.获取原生的DOM的方式 在js中,我们可以通过id.class或者标签获取DOM元素,vue中也为我们提供了获取原生DOM的方法,就是给标签或者组件添加ref属性,通过this.$refs获取,如 ...
- CentOS 6.5 QtCreator启动时 dbus-1的错误解决方法
启动QtCreator提示:dbus_connection_can_send_type的错误, QString::arg: Argument missing: 无法解析dbus_connection_ ...
- (转) latch 入门
原链接:http://www.itpub.net/thread-1424719-1-1.html (入门1)一直想点文章关于Latch的,又一直没写,一是因为懒,二是一直觉得现在关于Latch的书那么 ...
- 用python简便地抓取刘昊然的写真(17行代码)
17行python代码抓取刘昊然图片之家的写真 用python来爬取网页信息是很简便的.因为它有很多库来帮助我们实现我们想要的功能.本实验用到的库有:requests和bs4中的BeautifulSo ...