并发编程 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列表的创建.使用.更新.删除等实现方法与相关操作技巧,需要的朋 ...
随机推荐
- OpenCV多版本切换和配置--opencv 安装与卸载、添加 opencv_contrib modules 以及 OpenCv 多版本切换
1. 查看安装Opencv的版本.以及libs和cflags $ pkg-config --modversion opencv $ pkg-config --cflags opencv // 编译链接 ...
- Hadoop现在怎么样了?
之前我们提到大数据的时候就会提到Hadoop,Hadoop是大数据的基础框架,是大数据技术的代表.提到HDFS.MapReduce.Yarn,提到HBase.Hive.TEZ等Hadoop生态圈中的一 ...
- 【NOIP2017】图书管理员-C++
描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数. 每位借书的读者手中有一个需求码,这个需求码也是一个正整数.如果一本书的图 书编码恰好以读者的需求码结尾,那么这 ...
- 个人永久性免费-Excel催化剂功能第83波-遍历文件夹内文件信息特别是图像、音视频等特有信息
在过往的功能中,有体现出在Excel上管理文件的极大优势,在文件的信息元数据中,有图片和音视频这两类特有的属性数据,此篇对过往功能的一个补充,特别增加了图片和音视频信息的遍历功能. 使用场景 在文件管 ...
- MySql的数据库优化到底优啥了都??(1)
嘟嘟最不愿意做的就是翻招聘信息. 因为一翻招聘信息,工作经历你写低于两年都不好意思,前后端必须炉火纯青融汇贯通,各式框架必须如数家珍不写精通咋的你也得熟练熟练, 对了你是985吗?你是211吗??你不 ...
- 多个module实体类集合打一个jar包并上传至远程库
本章内容主要分享多个module中的实体类集合生成到一个jar包中,并且发布到远程库:这里采用maven-assembly-plugin插件的功能来操作打包,内容不长却贴近实战切值得拥有,主要节点内容 ...
- Spring 整合 ibatis
是的,真的是那个不好用的ibatis,不是好用的mybatis. 由于工作需要用到ibatis需要自己搭建环境,遇到了不少的坑,做一下记录. 一.环境配置 Maven JDK1.6 (非常重要,使用S ...
- CentOS7源码安装Nginx
系统平台:腾讯云服务器 CentOS 7.3 64位 一.安装编译工具及库文件 [root@VM_0_5_centos ~]# yum install -y make zlib zlib-devel ...
- JS中构造函数和普通函数有什么区别
JS中构造函数有普通函数有什么区别? 1.一般规则 构造函数都应该以 一个大写字母开头,eg: function Person(){...} 而非构造函数则应该以一个小写字母开头,eg: functi ...
- 【WPF】大量Canvas转换为本地图片遇到的问题
原文地址:https://www.cnblogs.com/younShieh 项目中遇到一个难题,需要将上百个没有显示出来的Canvas存储为图片保存在本地. 查阅资料后(百度一下)后得知保存为本 ...