Java 信号量 Semaphore 介绍
Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。
Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁 ReentrantLock 也可以实现该功能,但实现上要复杂些。
下面的Demo中申明了一个只有5个许可的Semaphore,而有20个线程要访问这个资源,通过acquire()和release()获取和释放访问许可。
package com.test;
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();
System.out.println("-----------------"+semp.availablePermits());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
exec.execute(run);
}
// 退出线程池
exec.shutdown();
}
}
执行结果如下:
Accessing: 0
Accessing: 1
Accessing: 3
Accessing: 4
Accessing: 2
-----------------0
Accessing: 6
-----------------1
Accessing: 7
-----------------1
Accessing: 8
-----------------1
Accessing: 10
-----------------1
Accessing: 9
-----------------1
Accessing: 5
-----------------1
Accessing: 12
-----------------1
Accessing: 11
-----------------1
Accessing: 13
-----------------1
Accessing: 14
-----------------1
Accessing: 15
-----------------1
Accessing: 16
-----------------1
Accessing: 17
-----------------1
Accessing: 18
-----------------1
Accessing: 19
分享到:
相关推荐
Java线程:概念与原理 ...Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结
信号量机制是 Java 中的一种线程同步机制。信号量是一个整数值,表示当前可用的资源数量。线程可以通过等待信号量来获取资源访问权限。信号量机制可以用于解决生产者-消费者问题、哲学家就餐问题等。 Java 中的 ...
#### 十六、Java线程:新特征-信号量 信号量是一种用于控制多个线程访问共享资源的机制,可以有效地限制并发访问的数量。 #### 十七、Java线程:新特征-阻塞队列 阻塞队列是一种特殊的队列,当队列为空时,从队列...
- **信号量** 通过 `Semaphore` 类来控制对有限资源的访问。 - **阻塞队列** `BlockingQueue` 提供了线程安全的队列实现,可以方便地用于生产者-消费者模型。 - **阻塞栈** `BlockingDeque` 类提供了一个线程...
#Java多线程示例-Java多线程应用实例 1- Java多线程:启动线程 2- Java多线程:易失性–基本线程通信 3- Java多线程:同步 ...12- Java多线程:信号量 13- Java多线程:可调用和未来 14- Java多线程:中断线程 从分叉
#### 十六、Java线程:新特征-信号量 信号量是一种控制多个线程访问共享资源的方法,常用于限制可以访问某些资源的最大线程数。 #### 十七、Java线程:新特征-阻塞队列 阻塞队列是一种特殊的队列,它能够阻塞插入...
- **信号量**:控制对有限资源的访问,如网络连接数限制。 - **阻塞队列**:用于线程间的数据交换,确保数据的正确性和安全性。 - **条件变量**:支持更复杂的线程同步场景。 - **原子量**:提供原子操作,避免了锁...
**JAVA 多线程之信号量Semaphore实例详解** 在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定...
课程内容: 1- Java 多线程:启动线程 2- Java 多线程:Volatile – ...12- Java 多线程:信号量 13- Java 多线程:Callable 和 Future 14- Java 多线程:中断线程 15- Java 多线程:Swing 中的多线程与 SwingWorker
Java进程信号量机制是多线程编程中一种有效的同步工具,它源于操作系统中的同步原语,用于管理和控制对共享资源的访问。在Java中,信号量由`java.util.concurrent.Semaphore`类实现,它提供了两种类型:可重用的二...
Java新特性中引入了线程池、`Future`和`Callable`接口支持有返回值的线程、高级锁机制、信号量、阻塞队列等,为多线程编程提供了更强大和灵活的支持。 综上所述,Java多线程编程涉及到线程的概念、创建与启动、线程...
3. **Semaphore**:信号量,限制同时访问特定资源的线程数量。 4. **Atomic* 类**:提供原子操作的类,如`AtomicInteger`,保证在多线程环境下变量的更新不被中断。 五、死锁与活锁 1. **死锁**:两个或多个线程...
#### 十三、Java线程:新特征-信号量 - **信号量**: - 信号量是一种用于控制对共享资源访问次数的同步工具。 - Java中的 `Semaphore` 类可以用于限制多个线程访问共享资源的数量。 #### 十四、Java线程:新特征...
10. **信号量(Semaphore)**:信号量是一种同步工具,可以限制同时访问特定资源的线程数量。它通过acquire()和release()方法控制许可。 11. **有返回值的线程**:如果线程需要返回结果,可以使用Future和Callable...
6. **实际编程中的应用**:在Java中,可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建时指定初始值,然后在线程中调用`acquire()`(等价于P操作)和`release()`(等价于V操作)方法来管理资源访问。 ...
#Java多线程1- Java多线程:启动线程2- Java多线程:易失...Java多线程:低级生产者-消费者10- Java多线程:可重入锁11- Java多线程:死锁12- Java多线程:信号量13- Java多线程:可调用和未来14- Java多线程:中断线程
Java提供了多种机制,如synchronized关键字、volatile变量、Lock接口(如ReentrantLock)以及信号量Semaphore。synchronized提供内置锁,保证同一时间只有一个线程访问临界区;volatile保证了变量在多线程环境中的...
Java提供了一系列并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(计数器门锁)和Exchanger(交换器),它们用于控制线程间访问资源的顺序和数量,协调多个线程间的操作。...