JAVA多线程之Semaphore
Semaphore:动态增减信号量,用于控制对某资源访问的同一时间的并发量。类似于令牌,谁拿到令牌(acquire)就可以去执行了,如果没有令牌则需要等待。
【如何获取】:
semaphore.tryAcquire(),尝试获取,不阻塞。
semaphore.acquire(),没信号量可用时,将进行阻塞等,可以被中断。
acquireUninterruptibly():获取信号量,将进行阻塞,但会忽略线程的中断而且不会抛出任何异常。
【如何释放】:
semaphore.release();
线程抛出各种异常,都别忘了在finally中释放信号量;
如果释放的比获取的信号量还多,例如获取了2个,释放了5次,那么当前信号量就动态的增加为5了,要注意。如下图所示:

例子:用信号量semaphore实现生产者与消费者
请仔细体会里面关于仓库的处理,
1 是如何保证入库时,如果仓库满就等待,
2 出库时,如果仓库无货就等待的。
3 以及对仓库只有10个库位的处理。
4 对同步问题的处理。
public class TestSemaphore {
public static void main(String[] args) {
for (int i = 0; i <= 3; i++) {
new Thread(new Producer()).start();
new Thread(new Consumer()).start();
}
}
//仓库
static WareHouse buffer = new WareHouse();
//生产者
static class Producer implements Runnable{
static int num = 1;
public void run() {
int n = num++;
while(true){
try{
buffer.put(n);
System.out.println(">"+n);
Thread.sleep(10);
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Consumer implements Runnable{
public void run() {
while (true) {
try {
System.out.println("<"+buffer.take());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class WareHouse{
//非满锁
final Semaphore notFull = new Semaphore(10);
//非空锁
final Semaphore notEmpty = new Semaphore(0);
//互斥锁
final Semaphore mutex = new Semaphore(1);
//库存容量
final Object[] items = new Object[10];
int putPosi, takePosi, count;
public void put(Object x)throws InterruptedException{
try{
notFull.acquire();
mutex.acquire();
items[putPosi] = x;
if (++putPosi == items.length) {
putPosi = 0;
}
count++;
}finally{
notEmpty.release();
mutex.release();
}
}
public Object take()throws InterruptedException{
notEmpty.acquire();
mutex.acquire();
try{
Object x = items[takePosi];
if(++takePosi == items.length){
takePosi = 0;
}
--count;
return x;
}finally{
notFull.release();
mutex.release();
}
}
}
}
也可以把Semaphore当锁来使用
当信号量的数量上限是1时,Semaphore可以被当做锁来使用。通过take和release方法来保护关键区域。请看下面的例子:
BoundedSemaphore semaphore = new BoundedSemaphore(1);
...
semaphore.acquire();
try{
//critical section
} finally {
semaphore.release();
}
JAVA多线程之Semaphore的更多相关文章
- Java多线程之Semaphore信号量
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6557874.html 学过操作系统的对 信号量 这个词应该不陌生,它是用来进行进程间通信,控制对 临界区 ...
- Java多线程之ConcurrentSkipListMap深入分析(转)
Java多线程之ConcurrentSkipListMap深入分析 一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...
- java多线程之yield,join,wait,sleep的区别
Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...
- Java多线程之Runnable与Thread
Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...
- JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止
JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止 背景 当单线程的程序发生一个未捕获的异常时我们可以采用try....catch进行异常的捕获,但是在多线程环境 ...
- java多线程之wait和notify协作,生产者和消费者
这篇直接贴代码了 package cn.javaBase.study_thread1; class Source { public static int num = 0; //假设这是馒头的数量 } ...
- Java——多线程之Lock锁
Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...
随机推荐
- 【转】 Pro Android学习笔记(五九):Preferences(3):EditText和Ringtone Preference
目录(?)[-] EditText Preferences xml文件 设备的存贮文件 Ringtone Preferences EditText Preferences xml文件 在res/xml ...
- linux下dns设置详解
DNS就是Domain Name System,它能够把形如www.21php.com这样的域名转换为211.152.50.35这样的IP地址;没有DNS,浏览21php.com这个网站时,就必须用2 ...
- Mybatis+Mysql 返回主键的值
需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="i ...
- 如何将OpenTSDB源码导入eclipse
OpenTSDB的官网上介绍了如何将OpenTSDB源码导入eclipse,官方链接,但步骤超级繁琐,还有一个简便方法,下面以导入OpenTSDB2.0.0为例. 1. 下载OpenTSDB2.0.0 ...
- ML 徒手系列 最大似然估计
1.最大似然估计数学定义: 假设总体分布为f(x,θ),X1,X2...Xn为总体采样得到的样本.其中X1,X2...Xn独立同分布,可求得样本的联合概率密度函数为: 其中θ是需要求得的未知量,xi是 ...
- python 基础 列表 增删改查
names = ["aaron", "alex", "james", "meihengfan"]names2 = [1, ...
- 编写html页面时常见的问题(转)
编写html页面时常见的问题(一) 说到写页面,肯定有很多人在刚接触编写页面这一块时遇到很多细节和兼容性的问题,那么在这里我总结一些经常遇到的小问题.希望能够帮助学习页面搭建的初学者! 虽然说ie ...
- layui 工具条实现分页
1.页面 <div id="getShowTable" style="width: 100%; height: auto;clear: both;"> ...
- LEADTOOLS V19: 世界领先的图像处理开发工具包强势来袭
投递人 itwriter 发布于 2014-12-22 16:04 评论(0) 有214人阅读 原文链接 [收藏] « » LEAD 科技于 2014 年 12 月 11 日发布 LEA ...
- linux 统计 程序 运行时间
测试 代码运行时间 linux 中的 <sys/time.h> 中 有个函数可以获取当前时间,精确到 微秒 ----> gettimeofday() #include <sy ...