操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java并发库的Semaphore可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁ReentrantLock也可以实现该功能,但实现上要负责些,代码也要复杂些。
下面的Demo中申明了一个只有5个许可的Semaphore,而有20个线程要访问这个资源,通过acquire()和release()获取和释放访问许可。
package concurrent;
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore;
public class TestSemaphore { public static void main(String[] args) { // 线程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能5个线程同时访问 final Semaphore semp = new Semaphore(5); // 模拟20个客户端访问 for (int index = 0; index < 20; index++) { final int NO = index; Runnable run = new Runnable() { public void run() { try { // 获取许可 semp.acquire(); System.out.println("Accessing: " + NO); Thread.sleep((long) (Math.random() * 10000)); // 访问完后,释放 semp.release(); } catch (InterruptedException e) { } } }; exec.execute(run); } // 退出线程池 exec.shutdown(); } } |
运行结果:
Accessing: 0
Accessing: 1
Accessing: 2
Accessing: 3
......
Accessing: 17
Accessing: 18
Accessing: 19
分享到:
相关推荐
介绍临界资源的访问机制,有Semaphore,signal,mutex等
信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问 (临界资源指同一时刻只能有有限个访问),常用于协助一组相互竞争的任务来访问临界资源。运行机制可以理解为:信号量是...
信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于0时,才能使用公共资源,使用后,函数sem_wait()减少信号量。函数...
a: 创建一个线程 b: 创建多个线程 c: 多线程访问同一资源 d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 ...I: 信号量 semaphore 解决线程同步问题
在windows系统下的os平台中,各个任务间是通过信号量来同步共同资源的,本文就信号量机制进行了详细的讲解,
信号量组件 信号量组件管理,一种提供对共享资源的独占访问的机制。 资源资源 并在
信号量基本上用于将任务与系统中的其他事件同步。在FreeRTOS中,信号量是基于队列机制实现的。FreeRTOS中有4种信号量: - 二进制信号量 - 计数信号量 - 互斥信号量 - 递归信号量 本文介绍: 二进制信号量的使用方法
2、用信号量机制解决进程(线程)的同步与互斥问题。 二、实验目的 1.掌握基本的同步互斥算法,理解生产者和消费者模型。 2.了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 3.学习使用Windows ...
在主流的Linux内核中包含了几乎所有现代的操作系统具有的同步机制,这些同步机制包括:原子操作、信号量(semaphore)、读写信号量(rw_semaphore)、spinlock、BKL(Big Kernel Lock)、rwlock、brlock(只包含在...
而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。 信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待...
背景知识信号量机制内核维护Semaphore这一数据结构,并提供P,V这一对原子操作,其中W用于阻塞进程自身在该信号量上,R用于释放一个阻塞在该信号量上的进程,
进程同步,信号量机制实现 设有 6 个程序 s1 ,…, s6 ,它们在并发系统中执行时如图所示的制 约关系, 试用 wait 和 signal 原语来实现它们之间的同步。 (10 分) Var a, b, c, d, e, f, g, h; semaphore:= 0, 0, ...
允许您使用MySQL在群集的Node.js环境中生成信号量。 这对于诸如cron作业或长时间运行的任务等只希望在单个实例上发生的事情很有用。 要求:MySQL服务器 安装 npm install mysql-semaphore --save 初始化: 有关...
semget函数创建一个新的信号量或是获得一个已存在的信号量键值。 semop函数用来改变信号量的值(包含P操作和V操作)。 semctl函数允许信号量信息的直接控制(包含初始化信号灯和删除信号灯)。 事实上,为了获得...
实例268——使用信号量(Semaphore)实现线程的同步 实例269——使用多线程进行文件搜索 实例270——获取当前系统的所有进程 实例271——实现应用程序在系统中只能运行一个实例 实例272——获取所有打开窗口...
2. 信号量 Semaphore() acquire() 删除 release() 增加 get_value() 获取 3. 同步互斥机制 : 解决了多个进程或者线程对共享资源的争夺 Event e.set e.clear e.wait Lock lock.acquire() lock.release() 4...
2、用信号量机制解决进程(线程)的同步与互斥问题。 二、实验目的 1.掌握基本的同步互斥算法,理解生产者和消费者模型。 2.了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 3.学习使用Windows ...
3.Semaphore:信号量机制,它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。在该项目中主要是保证在线程池中有正在执行的任务+准备执行的任务之和是一定的值。 4.异步加载图片以及图片的裁剪和旋转。...
ΜC/OS-II最多支持56个任务,其内核为占先式,总是执行就绪态的优先级最高的任务,并支持Semaphore(信号量)、Mailbox(邮箱)、Message Queue(消息队列)等多种常用的进程间通信机制。与大多商用RTOS不同的是,μC/...