gpt4 book ai didi

java - Java中如何使用锁来等待特殊条件?

转载 作者:行者123 更新时间:2023-11-30 07:07:01 25 4
gpt4 key购买 nike

我有一个对象:

public class Resource {
private Lock lock = new ReentrantLock();
private boolean processed = false;

public Lock getLock() {
return lock;
}

public boolean isProcessed() {
return processed;
}

public void setProcessed(boolean processed) {
this.processed = processed;
}
}

我想停止线程“一”,直到线程“二”将变量“processed”更改为 true。在“processed”设置为 true 后,我想唤醒线程“one”并继续做一些事情。

我知道我们可以使用wait和notify方法来组织它,但由于中断,这是非常危险的。
如果我只使用等待和通知方法,可能会出现无限等待的情况。
如果我们的 wait 方法由于某种原因被中断,我们会检查“process”变量是否仍然为 false,然后我们可以再次使用 wait,如下所示:

while(true){
if(!resource.isProcessed()){
resource.getLock().wait();
}
else{
break;
}
}

使用这样的代码是危险的,因为在我们检查“!resource.isProcessed()”之后和使用“resource.getLock().wait()”之前,另一个进程可以将“process”设置为true并且调用“resource.getLock().notify()”(这不会产生任何效果,因为我们还没有调用“wait()”)。

如何安全地等待某些条件?如何安全地通知/解锁某些条件?

最佳答案

Peter Lawrey在评论中回答有Condition在java中可用。 (谢谢指点)

以下是文档中提供的示例的副本:

 class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();

final Object[] items = new Object[100];
int putptr, takeptr, count;

public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}

public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}

关于java - Java中如何使用锁来等待特殊条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39932709/

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