并发编程 Semaphore的使用和详解
类Semaphore的基本使用
Semaphore的作用:限制线程并发的数量
课外话题【多线程的同步概念】:其实就是排着队去执行一个任务,执行任务是一个一个的执行,这样的优点是有助于程序逻辑的正确性,不会出现非线程安全问题,保证人系统功能的运行稳定。
Semaphore类结构图:

1、类Semaphore的构造函数permits 是许可的意思,代表同一时间,最多允许permits执行acquire() 和release() 之间的代码。
例如:
Semaphore semaphore = new Semaphore();
表示同一时间内最多只允许1个线程执行 acquire()和release()之间的代码。
2、方法acquire(n) 的功能是每调用1次此方法,就消耗掉n个许可。
3、方法release(n) 的功能是每调用1次此方法,就动态添加n个许可。
4、方法acquireUnnterruptibly()作用是是等待进入acquire() 方法的线程不允许被中断。
5、方法availablePermits() 返回Semaphore对象中当前可以用的许可数。
6、方法drainPermits() 获取并返回所有的许可个数,并且将可用的许可重置为0
7、方法 getQueueLength() 的作用是取得等待的许可的线程个数
8、方法 hasQueueThreads() 的作用是判断有没有线程在等待这个许可
9、公平和非公平信号量:
有些时候获取许可的的顺序与线程启动的顺序有关,这是的信号量就要分为公平和非公平的。所谓的公平信号量是获得锁的顺序与线程启动的顺序有关,但不代表100%获得信号量,仅仅是在概率上能保证,而非公平信号量就是无关的。
例如:
Semaphore semaphore = new Semaphore(,false);
False:表示非公平信号量,即线程启动的顺序与调用semaphore.acquire() 的顺序无关,也就是线程先启动了并不代表先获得 许可。
True:公平信号量,即线程启动的顺序与调用semaphore.acquire() 的顺序有关,也就是先启动的线程优先获得许可。
10、方法tryAcquire() 的作用是尝试获取1个许可。如果获取不到则返回false,通常与if语句结合使用,其具有无阻塞的特点。无阻塞的特点可以使不至于在同步处于一直持续等待的状态。
11、方法tryAcquire(n) 的作用是尝试获取n个许可,如果获取不到则返回false
12、方法tryAcquire(long timeout,TimeUnit unit)的作用是在指定的时间内尝试获取1个许可,如果获取不到则返回false
13、方法tryAcquire(int permits,long timeout,TimeUnit unit) 的作用是在指定的时间内尝试获取n 个许可,如果获取不到则返回false
14、多进路-多处理-多出路:允许多个线程同时处理任务
例如:
public class MyService {
private Semaphore semaphore = new Semaphore();
private Lock lock = new ReentrantLock();
public void testMethod(){
try
{
semaphore.acquire();
//synchronized (this)
//{
//lock.lock();
System.out.println(Thread.currentThread().getName()+" 开始时间:"+System.currentTimeMillis());
for(int i = ; i < ; i++){
System.out.println(Thread.currentThread().getName()+"打印"+ (i+)+"次");
}
System.out.println(Thread.currentThread().getName()+" 结束时间: "+System.currentTimeMillis());
//lock.unlock();
//}
semaphore.release();
}
catch(Exception e)
{
}
}
}
运行的效果是多个线程同时进入。并且多个线程有几乎同时执行完毕。
15、多进路-单处理-多出路:允许多个线程同时处理任务,但是顺序却是同步的,也就是阻塞的。所以也称单处理。
例如:在代码中加入ReentrantLock对象 ,或者使用synchronized 代码块,保存代码的同步性
public class MyService {
private Semaphore semaphore = new Semaphore();
private Lock lock = new ReentrantLock();
public void testMethod(){
try
{
semaphore.acquire();
synchronized (this)
{
//lock.lock();
System.out.println(Thread.currentThread().getName()+" 开始时间:"+System.currentTimeMillis());
for(int i = ; i < ; i++){
System.out.println(Thread.currentThread().getName()+"打印"+ (i+)+"次");
}
System.out.println(Thread.currentThread().getName()+" 结束时间: "+System.currentTimeMillis());
//lock.unlock();
}
semaphore.release();
}
catch(Exception e)
{
}
}
}
1.2Exchanger的使用
作用:可以是2个线程之间传输数据
1、 方法exchange() 方法具有阻塞的特色,也就是此方法被调用后等待其他线程来取得数据,如果没有,则一直等待。
并发编程 Semaphore的使用和详解的更多相关文章
- java并发编程(七)synchronized详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized( ...
- Java 并发编程(一) → LockSupport 详解
开心一刻 今天突然收到花呗推送的消息,说下个月 9 号需要还款多少钱 我就纳了闷了,我很长时间没用花呗了,怎么会欠花呗钱? 后面我一想,儿子这几天玩了我手机,是不是他偷摸用了我的花呗 于是我找到儿子问 ...
- Java并发编程基础--基本线程方法详解
什么是线程 线程是操作系统调度的最小单位,一个进程中可以有多个线程,这些线程可以各自的计数器,栈,局部变量,并且能够访问共享的内存变量.多线程的优势是可以提高响应时间和吞吐量. 使用多线程 一个进程正 ...
- VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 虚拟磁盘数据的传输方式 Transport Methods VixDiskLib_ListTransportModes 枚举支持的传输模式 Vi ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- linux中高并发socket最大连接数的优化详解
linux中高并发socket最大连接数的优化详解 https://m.jb51.net/article/106546.htm?from=singlemessage
- 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- Python编程之列表操作实例详解【创建、使用、更新、删除】
Python编程之列表操作实例详解[创建.使用.更新.删除] 这篇文章主要介绍了Python编程之列表操作,结合实例形式分析了Python列表的创建.使用.更新.删除等实现方法与相关操作技巧,需要的朋 ...
随机推荐
- 为使用mock方案测试,而重构代码的小小案例
import com.sun.deploy.config.DefaultConfig; import javax.security.auth.login.Configuration; import j ...
- Jenkins+Sonar搭建持续集成和代码质量检查环境
Jenkins+Sonar搭建 一.相关环境及下载地址 系统:Ubuntu JDK:1.8 MySQL:5.7 软件包: jenkins_2.121.3_all.deb sonarqube-7.3.z ...
- Scrum 使用絮叨
关于Scrum 的一些絮叨 Scrum 的推行的基础在于全员参与,全员协作,包含Dev, QA(quality assurance) ,BA(Business analyst)以及Supporter ...
- windbg 配置符号路径
(转)WINDBG的符号下载与符号路径问题 安装与配置 windbg 的 symbol (符号) 本篇是新手自己写的一点心得.建议新手看看.同时希望前辈多多指教. 写这篇的动机:在网上找了一上午的 w ...
- EF简介及CRUD简单DEMO
一.实体框架(Entity FrameWork)简介 • 简称EF • 与Asp.Net MVC关系与ADO.NET关系 • ADO.NET Entity FrameWork是微软以ADO.NET为基 ...
- 个人永久性免费-Excel催化剂功能第69波-专业图表库新增图表-刘万祥老师中国地图
Excel催化剂的[专业图表库],仅提供一个工具的输出,让用户可以在制作专业图表过程中更低的门槛,更快速的完成所想要实现的图表.具体参考:第69波-打造最专业易用的商务图表库https://www.j ...
- linux初学者-磁盘配额篇
linux初学者-磁盘配额篇 在使用磁盘时,只要有权限,不管什么用户都可以在其中写入数据,但是如果是多人在一个磁盘中写入数据,就会出现争议,如果一个用户将磁盘空间用完,那么其他人无法再使用.如下图所示 ...
- java - tcp如何保证传输的可靠性和有序性
TCP提供的是一种面向连接的,可靠性的字节流服务. 可靠性: 1.应用数据被TCP划分为最适合发送的数据包: 2.在TCP发送一个数据块后,将启动一个定时器,用以接收目的端的确认信息,若不能及时得到确 ...
- UltraEdit不自动生成保存备份文件(.bak)
UltraEdit修改文件或格式化文件保存后会生成烦人的.bak文件. 去掉该功能办法如下: 高级 -> 配置 -> 文件处理 -> 备份 “保存时备份文件”选择“不备份” (Adv ...
- spring读取xml配置文件(二)
一.当spring解析完配置文件名的占位符后,就开始refresh容器 @Override public void refresh() throws BeansException, IllegalSt ...