简介
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
概念
Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。
以一个停车场运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。
在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。
更进一步,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。 当一个线程调用Wait(等待)操作时,它要么通过然后将信号量减一,要么一直等下去,直到信号量大于一或超时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为加操作实际上是释放了由信号量守护的资源。
在java中,还可以设置该信号量是否采用公平模式,如果以公平方式执行,则线程将会按到达的顺序(FIFO)执行,如果是非公平,则可以后请求的有可能排在队列的头部。
JDK中定义如下:
Semaphore(int permits, boolean fair)
创建具有给定的许可数和给定的公平设置的Semaphore。
Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java并发库Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。
package cn.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; /** * 信号量 * * @author 林计钦 * @version 1.0 2013-7-25 下午02:03:40 */ public class SemaphoreTest { public static void main(String[] args) { // 线程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能5个线程同时访问 final Semaphore semp = new Semaphore(5); // 模拟20个客户端访问 for (int index = 0; index < 50; 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(); //availablePermits()指的是当前信号灯库中有多少个可以被使用 System.out.println("-----------------" + semp.availablePermits()); } catch (InterruptedException e) { e.printStackTrace(); } } }; exec.execute(run); } // 退出线程池 exec.shutdown(); } }
Accessing: 0 Accessing: 1 Accessing: 2 Accessing: 4 Accessing: 6 Accessing: 8 -----------------0 -----------------1 Accessing: 3 -----------------1 Accessing: 5 Accessing: 9 -----------------0 -----------------1 Accessing: 7 Accessing: 10 -----------------0 -----------------1 Accessing: 11 -----------------1 Accessing: 12 -----------------1 Accessing: 13 Accessing: 14 -----------------0 -----------------1 Accessing: 15 -----------------0 Accessing: 16 -----------------1 Accessing: 17 -----------------1 Accessing: 18 -----------------1 Accessing: 19 -----------------0 Accessing: 20 Accessing: 21 -----------------0 Accessing: 22 -----------------0 -----------------1 Accessing: 23 -----------------1 Accessing: 24 -----------------0 Accessing: 25 Accessing: 26 -----------------0 -----------------1 Accessing: 27 -----------------1 Accessing: 28 -----------------1 Accessing: 29 Accessing: 30 -----------------0 -----------------1 Accessing: 31 -----------------1 Accessing: 32 -----------------1 Accessing: 33 -----------------1 Accessing: 34 Accessing: 35 -----------------0 -----------------1 Accessing: 36 -----------------1 Accessing: 37 -----------------1 Accessing: 38 -----------------1 Accessing: 39 -----------------1 Accessing: 40 Accessing: 41 -----------------0 -----------------1 Accessing: 42 Accessing: 43 -----------------0 Accessing: 44 -----------------0 -----------------1 Accessing: 45 -----------------1 Accessing: 46 -----------------1 Accessing: 47 -----------------1 Accessing: 48 -----------------1 Accessing: 49 -----------------1 -----------------2 -----------------3 -----------------4 -----------------5
相关推荐
JAVA多线程--信号量(Semaphore) 信号量(Semaphore)是一种多线程环境下的设施,负责协调各个线程,以保证它们能够正确、合理地使用公共资源。从概念上讲,信号量维护了一个许可集。 信号量的类型有两种:单值信号...
- JUC包含了许多高级并发组件,如`Semaphore`信号量、`CyclicBarrier`回环栅栏、`CountDownLatch`倒计时器和`Exchanger`交换器等,它们可以帮助控制线程的执行顺序。 - `Semaphore`可以限制同时访问特定资源的线程...
在多线程编程中,当多个线程试图同时访问一个有限的资源时,信号量可以帮助我们协调这些线程,确保资源的有序分配和释放。 信号量主要由两个操作组成:`P(Wait)操作`和`V(Signal)操作`。这两个操作通常被封装在...
在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定资源的线程数量。 ### Semaphore简介 信号量...
Java提供了多种同步工具,如synchronized关键字、wait()和notify()方法、Lock接口(包括ReentrantLock可重入锁)以及Semaphore信号量等。这些工具能够确保共享资源在多线程访问时的安全性,防止数据竞争和死锁的发生...
Java提供了多种同步机制来解决多线程环境下的数据安全问题,如synchronized关键字、 volatile变量、Lock接口(如ReentrantLock)以及Semaphore信号量等。synchronized提供了内置锁,可以保证同一时刻只有一个线程...
#### 十五、Java线程:新特征-信号量 - `Semaphore` 类用于控制多个线程对有限资源的访问。 #### 十六、Java线程:新特征-阻塞队列 - `BlockingQueue` 是一种特殊的队列,当队列为空或满时,插入或移除元素的操作...
Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock、ReentrantReadWriteLock)以及Semaphore信号量。synchronized用于方法或代码块,可以保证同一时间只有一个线程执行特定代码,避免数据冲突...
本书还涉及到了Java并发工具类,如Semaphore信号量、CyclicBarrier栅栏、CountDownLatch倒计时器等,这些都是Java并发编程中的重要工具,可以帮助开发者更精细地控制线程执行。另外,书中还会介绍如何使用Future和...
3. **并发工具类**:如`CountDownLatch`、`CyclicBarrier`和`Semaphore`等,它们为多线程间的协调提供了便利,比如计数器、栅栏和信号量,可以用于控制线程的同步和通信。 4. **锁机制**:包括`synchronized`关键字...
Java提供了多种并发控制机制,如synchronized关键字、Lock接口(如ReentrantLock)以及Semaphore(信号量)等,用于控制线程的访问权限和执行顺序。 3. **网络I/O**:Java的`java.net`包提供了处理网络通信的基础...
在"semaphore控制多线程循序执行"的场景中,我们通常会用到计数信号量,它的核心作用是限制同时访问特定资源的线程数量。例如,如果我们要实现一个打印队列,让多个线程按顺序打印任务,Semaphore就可以用来保证打印...
- Semaphore:信号量,控制同时访问特定资源的线程数量。 - Phaser:更强大的同步工具,支持分阶段的同步。 7. **死锁、活锁与饥饿** - 死锁:两个或多个线程相互等待对方释放资源,导致都无法继续执行。 - ...
### Java多线程运算集合知识点解析 #### 一、Java多线程概念与原理 - **操作系统中的线程与进程**: - **进程**:指的是一个正在运行的应用程序,每个进程都拥有独立的内存空间。 - **线程**:是进程中的一个...
- `Semaphore`:信号量,用于限制并发访问的线程数量。 7. **线程设计模式**: - 生产者-消费者模式:使用`BlockingQueue`实现线程间的生产与消费。 - 线程池模式:通过`ExecutorService`实现线程复用,避免频繁...
- **Semaphore**:信号量,控制同时访问特定资源的线程数量。 - **ThreadPoolExecutor**:线程池,管理线程并处理任务队列,能有效控制运行的线程数量。 5. **文件传输** - **I/O流**:Java的`InputStream`和`...
3. Semaphore:信号量,用于限制同时访问某个资源的线程数量。 4. Executors框架:提供线程池服务,有助于管理和控制线程的生命周期。 六、线程优先级 Java中的线程优先级由Thread类的静态常量定义,如MIN_PRIORITY...
Java提供了多种同步机制,包括synchronized关键字、Lock接口、Semaphore信号量等。synchronized可以修饰方法或代码块,确保同一时间只有一个线程能够执行特定的代码段;Lock接口提供了更灵活的锁机制,如...
除此之外,Java的并发包`java.util.concurrent`提供了更高级的线程同步工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)允许一组线程等待彼此到达某个点后再继续执行,...
4. **并发控制**:在多线程环境中,为了保证数据的一致性和避免资源争抢,需要使用并发控制机制,如synchronized关键字、Lock接口、Semaphore信号量等。在端口扫描器中,可能需要这些机制来协调各线程间的操作,确保...