无法理解或实现信号量
Not able to understand or implement Semaphore
下面写了class来了解SemaPhore。然而结果却出乎意料。我无法理解 SemaPhore 的实际工作。它如何用作锁、信号和计数?
public class TrySemaPhore
{
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(10);
Semaphore semaphore = new Semaphore(2);
Runnable newTask= () -> {
boolean permit = false;
try {
permit = semaphore.tryAcquire();
if(permit)
System.out.println("doing work");
} finally {
if(permit){
semaphore.release();
System.out.println("Work done!!");
}
}
};
for(int i=0; i<=4; i++){
executor.submit(newTask);
}
stop(executor);
}
private static void stop(ExecutorService executor) {
/*code to stop executor*/
}
}
结果
doing work
Work done!!
doing work
Work done!!
doing work
Work done!!
doing work
Work done!!
doing work
Work done!!
我有 10 个固定数量的线程。我有 5 个不同的任务(for 循环)需要完成。我有带有 2 个许可证的信号量。我想了解信号量及其以一种非常简单的方式带来的好处(不像通过谷歌搜索获得的理论)。
计数信号量。从概念上讲,信号量维护一组
许可证。如果有必要,每个获取块,直到获得许可
可用,然后拿走它。每个版本增加一个许可证,
可能释放阻止收购方。
在获取项目之前,每个线程必须获得来自
信号量,保证一个项目可以使用。什么时候
线程已完成返回到的项目
池和许可证返回到信号量,允许另一个
线程来获取该项目。注意没有同步锁
在调用 acquire 时举行,因为这会阻止项目
从返回到池中。信号量封装了
同步需要单独限制对池的访问
从保持一致性所需的任何同步
池本身。
用例:
1.An 无界队列需要一个信号量(用于计算队列条目)和一个受互斥锁保护的线程安全队列(或等效的无锁线程安全队列)。信号量被初始化为零。生产者锁定互斥量,将对象推入队列,解锁互斥量并向信号量发出信号。消费者等待信号量,锁定互斥量,弹出对象并解锁互斥量。
2.Object 池,您可以在其中使用信号量限制资源的数量。多个线程尝试获取池中的对象并且您的对象数量有限,然后一些线程将等待直到一些线程释放。
class Pool {
private static final int MAX_AVAILABLE = 100;
private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
public Object getItem() throws InterruptedException {
available.acquire();
return getNextAvailableItem();
}
public void putItem(Object x) {
if (markAsUnused(x))
available.release();
}
下面写了class来了解SemaPhore。然而结果却出乎意料。我无法理解 SemaPhore 的实际工作。它如何用作锁、信号和计数?
public class TrySemaPhore
{
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(10);
Semaphore semaphore = new Semaphore(2);
Runnable newTask= () -> {
boolean permit = false;
try {
permit = semaphore.tryAcquire();
if(permit)
System.out.println("doing work");
} finally {
if(permit){
semaphore.release();
System.out.println("Work done!!");
}
}
};
for(int i=0; i<=4; i++){
executor.submit(newTask);
}
stop(executor);
}
private static void stop(ExecutorService executor) {
/*code to stop executor*/
}
}
结果
doing work
Work done!!
doing work
Work done!!
doing work
Work done!!
doing work
Work done!!
doing work
Work done!!
我有 10 个固定数量的线程。我有 5 个不同的任务(for 循环)需要完成。我有带有 2 个许可证的信号量。我想了解信号量及其以一种非常简单的方式带来的好处(不像通过谷歌搜索获得的理论)。
计数信号量。从概念上讲,信号量维护一组 许可证。如果有必要,每个获取块,直到获得许可 可用,然后拿走它。每个版本增加一个许可证, 可能释放阻止收购方。
在获取项目之前,每个线程必须获得来自 信号量,保证一个项目可以使用。什么时候 线程已完成返回到的项目 池和许可证返回到信号量,允许另一个 线程来获取该项目。注意没有同步锁 在调用 acquire 时举行,因为这会阻止项目 从返回到池中。信号量封装了 同步需要单独限制对池的访问 从保持一致性所需的任何同步 池本身。
用例: 1.An 无界队列需要一个信号量(用于计算队列条目)和一个受互斥锁保护的线程安全队列(或等效的无锁线程安全队列)。信号量被初始化为零。生产者锁定互斥量,将对象推入队列,解锁互斥量并向信号量发出信号。消费者等待信号量,锁定互斥量,弹出对象并解锁互斥量。
2.Object 池,您可以在其中使用信号量限制资源的数量。多个线程尝试获取池中的对象并且您的对象数量有限,然后一些线程将等待直到一些线程释放。
class Pool {
private static final int MAX_AVAILABLE = 100;
private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
public Object getItem() throws InterruptedException {
available.acquire();
return getNextAvailableItem();
}
public void putItem(Object x) {
if (markAsUnused(x))
available.release();
}