gpt4 book ai didi

java - 无法理解或实现信号量

转载 作者:行者123 更新时间:2023-11-30 02:30:31 26 4
gpt4 key购买 nike

我写了下面的类来理解 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.无界队列需要一个信号量(用于对队列条目进行计数)和一个受互斥锁保护的线程安全队列(或等效的无锁线程安全队列)。信号量被初始化为零。生产者锁定互斥体,将对象插入队列,解锁互斥体并向信号量发出信号。消费者等待信号量,锁定互斥锁,弹出对象并解锁互斥锁。

2.对象池,您可以使用信号量限制资源数量。多个线程尝试获取池中的对象,并且您的对象数量有限,那么某些线程将等待直到某些线程释放。

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();
}

关于java - 无法理解或实现信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44411727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com