信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。
package concurrent;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Semaphore;
/**
* 通过以下两种方式获得许可
* acquire()
* tryAcquire()
* @author user
*
*/
public class SemaphoreTest {
private final Set<Integer> set;
private final Semaphore sem;
public SemaphoreTest(int bound){
this.set = Collections.synchronizedSet(new HashSet<Integer>());
sem = new Semaphore(bound);
}
public boolean add(Integer o) throws InterruptedException{
sem.acquire(); //如果信号量已被用光阻塞
boolean wasAdded = false;
try{
wasAdded = set.add(o);
return wasAdded;
} finally {
if(!wasAdded){
sem.release();
}
}
}
public boolean addNoAwait(Integer o) throws InterruptedException{
boolean wasAdded = false;
if(sem.tryAcquire()){
try{
wasAdded = set.add(o);
} finally {
if(!wasAdded){
sem.release();
}
}
}
return wasAdded;
}
public boolean remove (Integer o){
boolean wasRemoved = set.remove(o);
if(wasRemoved){
sem.release();
}
return wasRemoved;
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
SemaphoreTest test = new SemaphoreTest(5);
for(int i = 0; i < 10; i++){
// System.err.println("add " + i + "=" +test.add(i));
System.err.println("add " + i + "=" +test.addNoAwait(i));
}
}
}
分享到:
相关推荐
**JAVA 多线程之信号量Semaphore实例详解** 在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定...
总结来说,Java同步互斥和信号量是解决多线程环境下资源访问冲突的重要工具。信号量提供了更灵活的控制,可以管理多个许可证,而不仅仅是二进制锁。理解这些概念并正确使用它们对于编写健壮、高效的多线程程序至关...
在Java中,`java.util.concurrent.Semaphore`类为我们提供了信号量的功能,它允许我们限制同时访问某个资源的线程数量,从而实现线程同步和资源管理。 信号量主要包含两种类型:可重用信号量(非递减信号量)和二...
信号量(Semaphore)是计算机操作系统中的一个同步工具,主要用于解决多线程或进程间的资源竞争问题。在并发编程中,当多个线程试图同时访问共享资源时,可能会引发竞态条件,导致数据不一致或者系统行为不可预测。...
其中,`Semaphore`类可以用来模拟信号量,从而实现PV操作。`Semaphore`维护了一个许可计数,当计数为0时,表示没有可用的资源,任何试图获取许可的线程将被阻塞,直到有其他线程释放许可。 P操作( acquire() )是...
信号量(Semaphore)是Java并发库中的一种工具类,它提供了一种控制多个线程对共享资源访问的方式,从而实现高级别的同步。在Java 5引入并发包`java.util.concurrent`后,信号量作为`Semaphore`类被添加,成为并发...
Semaphore,中文可译为信号量,起源于操作系统中的同步原语,用于协调多个线程对共享资源的访问。它维护了一个计数器,该计数器表示可用许可证的数量。当线程请求许可证时,如果计数器不为零,则会减少一个并允许...
3. **信号量(Semaphore)**:`java.util.concurrent.Semaphore`类可以用来限制对某些资源的并发访问数量。在生产者-消费者问题中,信号量可以用来表示缓冲区的空位或已满位。 4. **阻塞队列(BlockingQueue)**:...
3. **Semaphore信号量**:Java的`java.util.concurrent.Semaphore`类可以用于限制同时访问某个资源的线程数量,实现线程的同步。在这个场景下,可以设置信号量的许可数量为队列的容量,生产者在添加产品前需要获取一...
Semaphore类提供了信号量的概念,允许我们设定一个固定的许可(或者称为权限)数量,只有拥有足够许可的线程才能继续执行。 在描述中提到的场景,比如限制WebServer同时处理的请求数量为500个,Semaphore就非常适用...
Semaphore是Java并发编程中的一种重要工具,它是一个计数信号量,可以用来限制对共享资源的访问权限。在Java的`java.util.concurrent`包中,Semaphore类提供了对多个线程并发访问控制的能力,允许我们设置一个固定的...
...} 在这个例子中,我们使用 Semaphore 来实现信号量,通过 acquire() 方法来获取信号量,如果获取成功,则执行同步代码,否则,不执行同步代码。 多线程等待机制是 Java 中的另一个重要概念。它允许线程之间进行...
Java中可以使用`java.util.concurrent.Semaphore`类来实现信号量。在这个示例中,可能会有两个信号量,一个用于烟,一个用于火柴。每个吸烟者线程在开始抽烟前会先尝试获取烟的信号量和火柴的信号量。如果任一资源不...
这时,我们可以利用`java.util.concurrent`包中的`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)或`CountDownLatch`(计数门锁)等工具来更精细地控制线程的同步和唤醒。例如,`Semaphore`可以限制同时访问...
6. **Semaphore**:信号量是一个控制同时访问特定资源的线程数量的工具,可以用来限制并发线程数。`TestSemaphore.java`可能包含了如何使用`Semaphore`来限制系统资源(如数据库连接)的并发访问。 7. **FutureTask...
下面是一个使用Java内置的Semaphore类实现信号量的例子: ```java import java.util.concurrent.Semaphore; public class SemaphoreExample { public static void main(String[] args) { Semaphore semaphore = ...
此外,还有Semaphore(信号量)用于限制同时访问特定资源的线程数量,CountDownLatch和CyclicBarrier用于多线程间的协作。 在实际开发中,我们还会遇到线程池的概念。Java的ExecutorService和ThreadPoolExecutor提供...
3. **java.util.concurrent 包**:这个包提供了许多高级的线程同步工具,如Semaphore(信号量)、CyclicBarrier(回环屏障)、CountDownLatch(倒计时器)等。这些工具可以更灵活地控制线程的并发执行。 4. **...
Java提供了多种机制来实现线程同步,如`synchronized`关键字、`Lock`接口、`ReentrantLock`类、`Semaphore`信号量等。在`Callme.java`和`Caller.java`的例子中,`synchronized`关键字被用来同步方法`call()`和`f1()`...
这个工具包包含了丰富的同步工具,如Semaphore(信号量),ReentrantLock(可重入锁),Condition,以及CyclicBarrier和CountDownLatch等。这些高级工具允许开发者更灵活地控制线程的执行顺序和协作。 在上述的示例...