gpt4 book ai didi

java - 两个 BlockingQueue - 死锁

转载 作者:行者123 更新时间:2023-12-04 07:03:21 24 4
gpt4 key购买 nike

我需要以原子方式操作两个队列,但不确定什么是正确的同步策略:这就是我正在尝试的:

public class transfer {

BlockingQueue firstQ;
BlockingQueue secondQ;

public moveToSecond() {
synchronized (this){
Object a = firstQ.take();
secondQ.put(a)
}
}

public moveToFirst() {
synchronized(this) {
Object a = secondQ.take();
firstQ.put(a);
}
}
}

这是正确的模式吗?在 moveToSecond() 方法中,如果 firstQ 为空,该方法将等待 firstQ.take(),但它仍然持有该对象的锁。这将阻止 moveToFirst() 有机会执行。

我对等待期间的锁释放感到困惑-线程是否释放所有锁[这和 BlockedQUeue 锁?]?提供处理多个阻塞队列的原子性的正确模式是什么?

最佳答案

您正在使用正确的方法,使用通用互斥锁在两个队列之间进行同步。但是,为了避免您描述的第一个队列为空的情况,我建议重新实现 moveToFirst()moveToSecond()使用 poll()而不是 take() ;例如

public void boolean moveToFirst() {
// Synchronize on simple mutex; could use a Lock here but probably
// not worth the extra dev. effort.
synchronzied(queueLock) {
boolean success;

// Will return immediately, returning null if the queue is empty.
Object o = firstQ.poll();

if (o != null) {
// Put could block if the queue is full. If you're using a bounded
// queue you could use add(Object) instead to avoid any blocking but
// you would need to handle the exception somehow.
secondQ.put(o);
success = true;
} else {
success = false;
}
}

return success;
}

关于java - 两个 BlockingQueue - 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1496439/

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