并发编程 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列表的创建.使用.更新.删除等实现方法与相关操作技巧,需要的朋 ...
随机推荐
- Centos6.5安装Redis3.2.8
1 - Redis安装 redis安装 在网上一搜一大把,但是还是在这里想要能够统一吧,所以这个安装步骤是在Centos6.5 Minimal 上安装redis3.4.8,本次安装是在root 用户下 ...
- Java读写二进制数据
import java.io.*; import java.time.LocalDate; public class Test { public static void main(String[] a ...
- MyBatis select标签的用法
From<MyBatis从入门到精通> 第一步,在接口中添加方法: public interface UserMapper { SysUser selectById(Long id); } ...
- [ERROR]:INST-07008: Oracle 主目录(O) 位置的验证失败。用户没有创建主目录/实例位置的权限
安装weblogic12.1.3.0时,输入的安装命令是: 老是报这个错误. 百度半天好像没人报过这错……看来只有我这么粗心了…… 后来发现wls.rsp里面的Oracle_HOME指向目录错误,修改 ...
- xx.exe 中的 0x014180bd 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突(当指针访问异常时,应考虑是不是对象未创建)。
xx.exe 中的 0x014180bd 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突
- 2019年7月19日 - LeetCode0001
https://leetcode-cn.com/problems/two-sum/ 我的方法: class Solution { public int[] twoSum(int[] nums, int ...
- [leetcode] 110. Balanced Binary Tree (easy)
原题链接 水题 深度搜索每一节点的左右深度,左右深度差大于1就返回false. class Solution { public: bool isBalanced(TreeNode *root) { b ...
- 关于Servlet小总结
目录 Servlet Servlet简介 Servlet简单实现 Servlet注解 Servlet生命周期 启动时加载Servlet Servlet客户端 HTTP请求的结构 Servlet服务器 ...
- Mysql Atm取款机系统模拟案例
#创建ATM数据库 CREATE DATABASE ATM; #创建用户CREATE USER `ATMMaster` IDENTIFIED BY '1234';GRANT ALL ON ATM.* ...
- 0 ElasticSearch
注意事项 需要jdk环境1.7以上 Elasticsearch Kibana 的下载地址统一为https://www.elastic.co/downloads/ 问题排查可以登录https://dis ...