一文讲清Java中的信号量semaphore到底干嘛的

简介: 一文讲清Java中的信号量semaphore到底干嘛的

信号量(英语:semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值。当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一;当线程完成一次对semaphore对象的释放(release)时,计数值加一。当计数值为0,则线程等待该semaphore对象不再能成功直至该semaphore对象变成signaled状态。semaphore对象的计数值大于0,为signaled状态;计数值等于0,为nonsignaled状态.


semaphore对象适用于控制一个仅支持有限个用户的共享资源,是一种不需要使用忙碌等待(busy waiting)的方法。


信号量的概念是由荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)发明的,广泛的应用于不同的操作系统中。在系统中,给予每一个进程一个信号量,代表每个进程目前的状态,未得到控制权的进程会在特定地方被强迫停下来,等待可以继续进行的信号到来。如果信号量是一个任意的整数,通常被称为计数信号量(Counting semaphore),或一般信号量(general semaphore);如果信号量只有二进制的0或1,称为二进制信号量(binary semaphore)。在linux系统中,二进制信号量(binary semaphore)又称互斥锁(Mutex)。


计数信号量具备两种操作动作,称为V(signal())与P(wait())(即部分参考书常称的“PV操作”)。V操作会增加信号标S的数值,P操作会减少它。


运作方式:


初始化,给与它一个非负数的整数值。

运行P(wait()),信号标S的值将被减少。企图进入临界区段的进程,需要先运行P(wait())。当信号标S减为负值时,进程会被挡住,不能继续;当信号标S不为负值时,进程可以获准进入临界区段。

运行V(signal()),信号标S的值会被增加。结束离开临界区段的进程,将会运行V(signal())。当信号标S不为负值时,先前被挡住的其他进程,将可获准进入临界区段。

Windows API提供的semaphore

线程使用CreateSemaphore或CreateSemaphoreEx函数创建一个semaphore对象[1]。此时可以指定semaphore的当前计数值与计数值上限;也可指定semaphore对象的名字。其他进程中的线程可以指出已存在的semaphore对象的名字通过调用OpenSemaphore函数打开它。


如果多个线程在等待一个semaphore对象,不保证按照先进先出(FIFO)顺序调度这些等待线程。外部事件,如内核模式的异步过程调用可改变等待顺序。


在semaphore对象为signaled状态时,等待函数返回会把该semaphore对象计数值减1。函数ReleaseSemaphore把semaphore对象的计数值增加指定的值。任何线程,哪怕它没有等待完成过该semaphore对象,也可以使用ReleaseSemaphore来增加semaphore对象的计数。如果ReleaseSemaphore导致对象计数值超过上限,则该函数调用失败,返回298号错误:“Too many posts were made to a semaphore”。


一个线程多次等待同一个semaphore对象,每次等待操作完成都会降低semaphore对象计数值(直至计数值为0时该线程阻塞)。然而,通过multiple-object等待函数使用一个数组包含着同一个semaphore对象的多个句柄,不能实现对这个semaphore对象计数值的多次下降。


用完semaphore对象后,调用CloseHandle函数关闭它。semaphore对象的最后一个句柄被关闭后,操作系统会摧毁它。关闭semaphore并不影响它的计数值。因此,关闭semaphore前或者进程终止前,要确保已经正确调用过ReleaseSemaphore。否则,挂起等待该semaphore对象的线程会永久阻塞或超时返回。


目录
相关文章
|
8天前
|
安全 Java 测试技术
今天我们来聊一聊Java中的Semaphore
今天我们来聊一聊Java中的Semaphore
16 3
|
3月前
|
Java 调度
JAVA同步锁Semaphore
JAVA同步锁Semaphore
|
4月前
|
Java C++
Java实现信号量机制(生产者消费者问题)的三种方式
Java实现信号量机制(生产者消费者问题)的三种方式
35 0
|
7月前
|
SQL 安全 Java
JAVA的第一篇文章(Java,干嘛啊,哎呦~)—— JAVA概述和一部分基础语法
JAVA的第一篇文章(Java,干嘛啊,哎呦~)—— JAVA概述和一部分基础语法
|
11月前
|
Java 程序员
Java中的Semaphore和CountDownLatch这两个工具类的使用方法和实际应用场景
Java中的Semaphore和CountDownLatch这两个工具类的使用方法和实际应用场景
172 0
|
12月前
|
Java
Java Review - 并发编程_ 信号量Semaphore原理&源码剖析
Java Review - 并发编程_ 信号量Semaphore原理&源码剖析
75 0
|
12月前
|
Java
Java多线程:Semaphore
Java多线程:Semaphore
86 0
|
Java 自动驾驶 小程序
JAVA的AQS是否了解,它是干嘛的?
JAVA的AQS是否了解,它是干嘛的?
3242 0
JAVA的AQS是否了解,它是干嘛的?
|
Java
【Java技术指南】「原理剖析」Semaphore工作原理分析
【Java技术指南】「原理剖析」Semaphore工作原理分析
75 0
|
Java Windows
Java 并发编程之Semaphore详解
Java 并发编程之Semaphore详解