原先多线程并发编程的学习笔记和代码整理一下贴上来。
---------------------------------
信号量Semaphore
根据JDK文档描述:
一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。
个人理解为定义一个信号量同时指定它的许可数量,acquire时许可+1,release时许可-1。如果到达最大许可数时,后面的线程会阻塞。
一个简单的示例:
定义一个打印资源id的任务。该任务在运行前先获取信号量的一个许可,运行完后会释放该许可。
class ResourceInfo implements Runnable{ private final int resId; private Semaphore semaphore; public ResourceInfo(int rid,Semaphore semp){ this.semaphore=semp; resId=rid; } @Override public void run() { try{ semaphore.acquire(); System.out.println("resId:"+resId); Thread.sleep((long) (Math.random() * 10000)); semaphore.release(); }catch(InterruptedException e){ e.printStackTrace(); } } }然后使用信号量:
ExecutorService exec = Executors.newCachedThreadPool(); Semaphore semap=new Semaphore(10); for(int i=0;i<20;i++){ exec.execute(new ResourceInfo(i, semap)); } exec.shutdown();
这里定义了一个信号量,最多允许10个任务获取许可,然后一次启动20个任务。运行结果如下:
resId:0 resId:2 resId:1 resId:3 resId:5 resId:6 resId:4 resId:7 resId:8 resId:9 resId:10 resId:11 resId:13 resId:12 resId:14 resId:16 resId:15 resId:17 resId:19 resId:18
前10个任务获取到许可后,后面的10个任务会阻塞,直到前面的任务释放许可。这里我们修改一下:
Semaphore semap=new Semaphore(10,true);
指定公平设置(默认为false):如果此信号量保证在争用时按先进先出的顺序授予许可,则为 true;否则为 false。再运行一下看看:
resId:0 resId:3 resId:2 resId:1 resId:4 resId:5 resId:7 resId:6 resId:8 resId:9 resId:10 resId:11 resId:12 resId:13 resId:14 resId:15 resId:16 resId:17 resId:18 resId:19
公平设置后,被阻塞的线程就会按照先进先出的顺序获得许可,因此,后面10个线程是顺序打印Id信息的。
相关推荐
Java并发编程(23)并发新特性—信号量Semaphore(含代码)编程开发技术共3页.pdf.zip
难堪的一次面试: 信号量Semaphore了解过吗?没有
主要介绍了Java并发编程Semaphore计数信号量详解,具有一定参考价值,需要的朋友可以了解下。
a: 创建一个线程 b: 创建多个线程 c: 多线程访问同一资源 d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 ...I: 信号量 semaphore 解决线程同步问题
高并发编程第三阶段23讲 Semaphore工具的介绍以及借助于Semaphore构造一个Lock_.mp4 高并发编程第三阶段24讲 Semaphore工具API详细介绍-上_.mp4 高并发编程第三阶段25讲 Semaphore工具API详细介绍-下_.mp4 ...
使用信号量(Semaphore)实现线程的同步
Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...
多线程编程:信号量使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...
基于 Java 的并发信号量的计数信号量。 安装 通过 npm 安装模块: npm install async-semaphore 快速示例 // fairness false var Semaphore = require ( 'async-semaphore' ) ; var semaphore = new Semaphore ( ...
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
主要介绍了Java并发编程之Semaphore(信号量)详解及实例的相关资料,需要的朋友可以参考下
运行机制可以理解为:信号量是一个正值,代表资源的可访问数目,当有任务访问时,这个数目减一,任务访问完成时,任务访问结束,释放他,让他加一,信号量为0时,其他任务则不能获取他,选择退出或者等待挂起,直到...
java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+...
java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...
第三章 并发与同步:信号量夏文副教授哈尔滨工业大学(深圳)2021年秋季信号的介绍 (Introduction to Signals)同步(Synchroniz
龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...
高并发编程第三阶段23讲 Semaphore工具的介绍以及借助于Semaphore构造一个Lock_.mp4 高并发编程第三阶段24讲 Semaphore工具API详细介绍-上_.mp4 高并发编程第三阶段25讲 Semaphore工具API详细介绍-下_.mp4 ...
这篇文章主要介绍了python线程信号量semaphore使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.semaphore信号量原理 多线程同时运行,能提高程序的...