Semaphore类是一个计数信号量,必须由获取它的线程释放。通常用于控制同时访问特定资源的线程数目。
可以将Semaphore理解成一个停车场,里面有指定数量的停车位。acquire就是申请占用一个停车位,release就是释放一个停车位。
package com.seasy.test; import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class SemaphoreTest { private static Semaphore semaphore; private static Random rnd = new Random(); public static void main(String[] args) { semaphore = new Semaphore(3); //初始化许可证数量 System.out.println(semaphore.availablePermits()); //当前可用的许可证数量 //System.out.println(semaphore.drainPermits()); //获得并返回剩余所有可用的许可证 System.out.println(semaphore.getQueueLength()); //获取当前Semaphore对象上正在等待许可证的线程数量 System.out.println(semaphore.hasQueuedThreads()); //判断当前Semaphore对象上是否存在正在等待许可证的线程 System.out.println(semaphore.isFair()); //是否公平模式FIFO for(int i=0; i<10; i++){ Thread thread = new Thread(new Runnable() { @Override public void run() { try{ //boolean b = semaphore.acquire(); //阻塞式获取一个许可,线程可中断 //semaphore.acquireUninterruptibly(); //阻塞式获取一个许可,线程不可中断 boolean b = semaphore.tryAcquire(); //非阻塞式获取一个许可 if(b){ int value = rnd.nextInt(2000); if(value < 100){ value = 100; } System.out.println(Thread.currentThread().getName() + ": " + value); TimeUnit.MILLISECONDS.sleep(value); semaphore.release(); //释放一个许可 System.out.println(Thread.currentThread().getName() + " ok"); } }catch(Exception ex){ ex.printStackTrace(); } } }); thread.start(); } System.out.println("ok"); } }
相关推荐
信号量有两种类型:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。二进制信号量的值只能为0或1,相当于一个互斥锁,确保同一时间只有一个线程能访问资源。计数信号量的值可以为任何非负整数...
信号量Semaphore,这是一个在多线程编程中至关重要的同步机制,尤其在操作系统设计和并发编程领域,它扮演着协调多个线程对共享资源访问的角色。面试中被问及但回答不出,可能会显示出对并发控制理解的不足,因此,...
计数信号量可以有任意非负的初始值,而二进制信号量则等同于一个简单的互斥锁,其初始值为1,意味着同一时间只能有一个线程访问。 **1. QSemaphore的构造与基本操作** QSemaphore可以通过指定初始计数值来创建,...
它有两种类型:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。二进制信号量只有0和1两个状态,通常用于互斥访问,而计数信号量可以有任意非负整数值,可以允许多个线程同时访问资源,但不...
Semaphore是一种计数信号量,它可以有正整数值,用于管理多个线程对公共资源的访问。当信号量的值为正时,线程可以获取一个许可(或称资源),然后继续执行;当值为零时,线程会被阻塞,直到其他线程释放一个许可。...
- **计数信号量**:可以取任意非负整数值,用于解决生产者-消费者问题等场景。 #### 四、信号量操作 信号量的核心操作包括`wait`和`signal`: - **wait操作**:也称为`down`或`P`操作,用于获取信号量的锁。如果...
基于 Java 的并发信号量的计数信号量。 安装 通过 npm 安装模块: npm install async-semaphore 快速示例 // fairness false var Semaphore = require ( 'async-semaphore' ) ; var semaphore = new Semaphore ( ...
Java并发编程Semaphore计数信号量详解 Java并发编程中,Semaphore(信号量)是一种高效的同步机制,允许一定数量的线程访问某个资源。在本文中,我们将详细介绍Java并发编程Semaphore计数信号量的工作原理和应用。 ...
在Minix中,信号量分为两种类型:二进制信号量和计数信号量。二进制信号量只有两个状态,0表示资源不可用,1表示资源可用;计数信号量则可以有任意非负整数值,表示资源的数量。 sema.patch 文件可能包含了对Minix...
- **计数信号量**:计数值可以在0到某个最大值之间变化。它允许一定数量的线程同时访问资源,超过限制时,其他线程会被挂起。 在提供的压缩包文件中,我们看到了一些关键文件: - **rtconfig.h**:这是RT-Thread的...
在UCOSIII中,信号量分为两种类型:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。二进制信号量只有两种状态,要么被占用(0),要么空闲(1);计数信号量则可以有任意非负整数值,表示...
Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...
2. **计数信号量**:计数信号量则可以有更大的取值范围,表示可使用的资源数量。当资源被占用时,信号量值减一,如果减后值仍大于0,则其他任务还可以继续获取资源;若减后值为0,则后续请求任务会被挂起,等待信号...
2. **计数信号量:**在某些场景下,如多线程共享一个资源池时,计数信号量更加适用。每个任务获得信号量意味着可以使用一个资源,当任务完成操作后,需要归还信号量以释放资源。 **邮箱(Mailbox)** 邮箱是UCOSII...
// 使用后释放,增加信号量计数值 } else { // 处理等待超时或错误的情况 } ``` `WaitForSingleObject()`函数的第一个参数是我们要等待的信号量对象,第二个参数表示等待的超时时间,`INFINITE`表示无限制等待。...
信号量(Semaphore)是实现线程同步的一种有效工具,它源于早期的计算机操作系统理论,由荷兰计算机科学家Dijkstra提出。在Windows系统中,信号量作为内核对象被广泛使用,可以用来控制对共享资源的访问。 信号量的...
信号量分为两种类型:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。二进制信号量只有两个状态,0表示不可用,1表示可用,常用于互斥访问。计数信号量可以有任意非负值,用于管理多个资源...
信号量(Semaphore)是一种经典的同步机制,用于控制对共享资源的访问。在易语言中,我们可以利用其提供的信号量API来实现线程间的同步与互斥。信号量值可以用来表示资源的可用数量,当线程试图获取一个资源时,如果...
在VC++环境中,我们通常使用Windows API来管理线程的同步和通信,其中信号量(Semaphore)就是一种常用工具。本文将通过一个简单的VC线程信号量使用例子来介绍其工作原理和应用。 信号量是一种同步机制,用于控制对...
在IT行业中,多线程编程是提升程序性能和并发处理能力的重要手段,而信号量(Semaphore)则是多线程同步中的关键概念。本篇将详细探讨MFC(Microsoft Foundation Classes)框架下如何利用信号量来实现线程间的同步与...