操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore
可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而
release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁ReentrantLock也可以实现该功能,但实现上要负责些,代码也要复杂些。
下面的Demo中申明了一个只有5个许可的Semaphore,而有20个线程要访问这个资源,通过acquire()和release()获取和释放访问许可。
package com.cisco.learning;
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();
// 只能个线程同时访问
final Semaphore semp = new Semaphore(5);
// 模拟个客户端访问
for (int index = 1; index < 21; 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() * 1000));
// 访问完后,释放
System.out.println("Release: " + NO);
semp.release();
} catch (InterruptedException e) {
}
}
};
exec.execute(run);
}
// 退出线程池
exec.shutdown();
}
}
Accessing: 1
Accessing: 3
Accessing: 2
Accessing: 4
Accessing: 5
Release: 5
Accessing: 6
Release: 1
Accessing: 7
Release: 4
Accessing: 9
Release: 3
Accessing: 8
Release: 9
Accessing: 10
Release: 6
Accessing: 11
Release: 7
Accessing: 12
Release: 12
Accessing: 13
Release: 13
Accessing: 14
Release: 2
Accessing: 15
Release: 10
Accessing: 16
Release: 15
Accessing: 17
Release: 8
Accessing: 18
Release: 18
Accessing: 19
Release: 17
Accessing: 20
Release: 16
Release: 11
Release: 14
Release: 19
Release: 20
分享到:
相关推荐
《深入浅出Java Semaphore》 Semaphore,中文通常称为信号量,是Java并发编程中的一种重要工具,自JDK 1.5版本起被引入。它主要用于控制对特定资源的并发访问,确保资源得到合理的使用。Semaphore维护了一组虚拟的...
在Test类的main方法中,使用newCachedThreadPool()创建了一个缓存线程池,它可以动态调整线程数量,但在这个例子中,线程池的使用主要是为了启动线程,对Semaphore的理解并无直接影响。 总之,Semaphore是Java并发...
在构造Semaphore时,可以通过传入布尔值决定使用哪种类型的锁。 在Semaphore中,`acquire()`方法用于获取一个许可,如果当前许可数足够,线程将获得同步状态并减少许可数,否则线程将被放入同步队列等待。`release...
Java多线程编程是开发高并发应用的关键技术之一,Semaphore工具是Java并发包(java.util.concurrent)中的一个重要组件,用于控制同时访问特定资源的线程数量。本篇将深入讲解Semaphore的基本概念、工作原理以及如何...
本文将详细介绍 Semaphore 的工作原理、使用方法以及如何在实际项目中应用它。 Semaphore 是Java并发编程中实现信号量机制的重要工具。它通过维护一个许可集来控制同时访问特定资源的线程数量,从而避免资源竞争和...
在Java多线程编程中,线程的并发控制是非常关键的一部分,它确保多个线程能够协同工作并有效地访问共享资源。...在实际开发中,根据需求合理地使用Semaphore可以帮助优化系统的并发性能,确保系统稳定且高效地运行。
`doSomething`方法使用`acquire()`来获取许可证,然后执行业务逻辑,最后通过`release()`释放许可证。`acquire()`会使当前线程阻塞,直到获取到许可证,而`release()`则会释放一个许可证,可能唤醒正在等待的线程。 ...
除了基本的`acquire()`和`release()`方法,Semaphore还提供了`tryAcquire()`方法,它可以在没有阻塞的情况下尝试获取许可,以及`availablePermits()`方法,用于查询当前可用的许可数量。 在实际应用中,Semaphore常...
Semaphore的基本用法 2.1 创建Semaphore对象 2.2 acquire()方法 2.3 release()方法 控制资源访问数量 3.1 场景介绍 3.2 使用Semaphore控制资源访问 实现有界资源池 4.1 场景介绍 4.2 使用Semaphore实现有界资源池 ...
Java中Semaphore(信号量)的使用方法 Semaphore(信号量)是一种非常重要的并发访问控制机制,它可以用来保护一个或者多个共享资源的访问。Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个...
Semaphore的主要方法包括`acquire()`和`release()`: 1. `acquire()`:尝试获取一个许可证。如果当前许可证数量大于0,则减少一个许可证并返回,否则线程会被阻塞,直到有足够的许可证可用。在这个例子中,`thread1...
在实际使用中,根据具体需求选择合适的方法,如CountDownLatch适用于一个线程等待多个线程的场景,CyclicBarrier适合多个线程协作执行多阶段任务,而Semaphore则可以用于限制资源的并发访问。 在深入理解这些工具的...
在Java中,使用Semaphore可以轻松地实现多线程环境下的资源访问控制,例如: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent....
在每个Runnable对象中,我们使用acquire()方法来获取当前Semaphore对象的许可证,如果获取成功,则执行相应的操作,否则,线程将被阻塞,直到获取到许可证。 在main()方法中,我们创建了一个固定大小的线程池,用于...
Java判断线程池线程是否执行完毕是Java多线程编程中的一种常见问题,当我们使用线程池来执行多个任务时,需要判断所有的子线程是否已经执行完毕,以便进行后续操作。下面我们将介绍两种解决方案:使用Semaphore和...
Java并发工具类是Java并发编程中的重要组成部分,其中包括了多种实用的工具,如CountDownLatch、Semaphore和Exchanger,这些工具类极大地简化了多线程环境下的同步和协调问题。 1. **CountDownLatch**: ...
在Java并发编程中,Semaphore是一种重要的同步工具类,它提供了对有限资源的访问控制,能够有效地管理和限制同时访问特定资源的线程...了解和熟练掌握Semaphore的使用,对于提升Java并发程序的性能和稳定性至关重要。
下面是一个简单的Java Semaphore使用示例,模拟了一个只有两个车位的停车场: ```java import java.util.concurrent.Semaphore; public class ParkingLot { private Semaphore semaphore = new Semaphore(2); ...
Java并发系列之Semaphore源码分析 Java并发系列之Semaphore源码分析是Java并发系列中的一篇重要文章,主要为大家详细介绍了Java并发系列之Semaphore源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 ...
Java 类库和包是Java编程语言的核心组成部分,它们提供了丰富的功能和工具,使得开发者能够构建复杂的应用程序。本文将深入探讨Java类库和包的...理解和掌握这些类库及包的用法,是成为一位合格Java程序员的关键步骤。