线程中的同步辅助类Semaphore
同步辅助类 线程池 并发集合类 都是在线程同步的基础上增加了一些同步的东西,在线程同步的基础上更好的实现线程同步.实现的效率更高,更方便而已.
多线程并不是很难 需要你把代码写出来...然后分析运行的效果.
软件包 java.util.concurrent JDK1.5之后才出现的. 同步辅助类提供了更优秀的解决方案.
同步器
四个类可协助实现常见的专用同步语句。
Semaphore 是一个经典的并发工具。
CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。
CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。
Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。
类 Semaphore
一个计数信号量。从概念上讲,信号量维护了一个许可集。
Semaphore中维护了一个可许集,这个可许集的体现就是构造方法中传入一个int值
final Semaphore semaphore = new Semaphore(5);
信号量:Semaphore。
允许临界区(共享内容)内存在固定个数的线程,并发访问。
如果信号量为1.成为二进制信号量,和同步(synchronized) 效果一样。
场景:

一个混沌摊,一开始只有一个桌子,一张桌子同时只能被一个人使用,只有拿到许可之后才可以使用这个桌子. 后来有了5个桌子,最多能允许5个拿到许可的人同时访问.
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; public class SemaphoreDemo { public static void main(String[] args) {
final Semaphore semaphore = new Semaphore(5);
//Semaphore中维护了一个可许集,这个可许集的体现就是构造方法中传入一个int值
//有5个许可,同时允许5个线程同时来拿 for (int i = 0; i < 50; i++) { new Thread(new Runnable() { @Override
public void run() {
try {
semaphore.acquire();//获得一个许可,从5减去1,有许可的才让访问
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " :来了,现在有 "+(5-semaphore.availablePermits())+" 名顾客");//有几名顾客就意味着有多少个并发. try {
TimeUnit.SECONDS.sleep(new Random().nextInt(3));
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("-->" + Thread.currentThread().getName()
+ " :走了"); semaphore.release();//释放许可
}
}).start(); }
}
}
线程中的同步辅助类Semaphore的更多相关文章
- 线程中的同步辅助类CountDownLatch
四个类可协助实现常见的专用同步语句.Semaphore 是一个经典的并发工具.CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号.事件或条件前阻塞执行.Cyc ...
- 线程中的同步辅助类Exchanger
Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的. 允许两条线程之间交换数据.Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法 ...
- Java线程中的同步
1.对象与锁 每一个Object类及其子类的实例都拥有一个锁.其中,标量类型int,float等不是对象类型,但是标量类型可以通过其包装类来作为锁.单独的成员变量是不能被标明为同步的.锁只能用在使用了 ...
- python线程中的同步问题
多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改1000000次,num的最终的结果应该为2000000.但是由于是多线程访问,有可能出现下面情 ...
- JDK中线程中实现同步等待闭环的一种方式
实际Thread类自带的join方法就实现了线程同步等待,具体可以通过案例实践,如下: 本文的重点不是join,而是另一种设计的同步等待实现,涉及的关键类有:Thread.Runable.Callab ...
- java线程中的同步锁和互斥锁有什么区别?
两者都包括对资源的独占. 区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,也没有固定的执行顺序. 2:同步是线程通过一定的逻辑顺序占有资源,有一定的合作关系去完成任务.
- CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...
- Java中的5种同步辅助类
当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问.线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线 ...
- Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semaphore、Phaser)
我在<JDK1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结 ...
随机推荐
- java Concurrent包学习笔记(一):ExecutorService
一.介绍 ExecutorService是java.util.concurrent包中的一个线程池实现接口.其有两个实现类: 1)ThreadPoolExecutor:普通线程池通过配置线程池大小,能 ...
- CPU load高而使用率低的问题分析
最近服务器上出现了一个很诡异的问题,症状如下图所示: 查看进程发现: 如上图所示,非常多的df -h进程没有退出.于是手工kill掉这些 df -h进程.cpu load恢复正常. 至于为什么会有这么 ...
- jquery页面隐藏和展开之间切换
html页面: <p id="myp4">默认情况下,这段话是隐藏的,点击按钮以后,这段话就展开,并且按钮上的值改变</p> <button id=& ...
- #微码分享#AES算法的C++包装类
AES为Advanced Encryption Standard的缩写,中文名:高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替代DES.基于std:: ...
- WebGIS博客文本分析(词频分析)手动扒取 去除格式 词语分割 统计分析
1. [置顶](一)开篇—杂谈WebGIS 摘要: 文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 ...
- _编程语言_C++_简介
扩展名: .cpp..cp或.c C++编译器: GNU的gcc 编译器
- 6609 - Minimal Subarray Length
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- VS2010与VS2013中的多字节编码与Unicode编码问题
1. 多字节字符与单字节字符 char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t. char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因 ...
- hdu 3030
这道题主要就是问你,长度为n的序列,有多少种上升的子序列 当前点的情况种数等于前面所有小于它的点的种数相加 + 1 1就是只有这一个点的时候的序列 那就是要多次查询前面比它小的点的种数的和 那么就是区 ...
- 7.Layout布局(tabs、accordion、layout)
一.tabs选项卡: 二.accordion手风琴: 三.经由div标记创建layout布局: 注意:center不是定位得到的,而是通过其他的几个位置计算得到的,如果不写center整个布局就无法初 ...