【发布时间】:2012-08-14 05:21:30
【问题描述】:
我打算在生产者和消费者线程之间编写一个共享缓冲区。这是我的代码:
class PQueue
{
Token token;
boolean flag = false; // false: add, true: poll
PQueue()
{
token = null;
}
synchronized void add(Token token)
{
if(flag == true)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag = true;
notify();
this.token = token;
}
synchronized Token poll()
{
if(flag == false)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag = false;
notify();
return this.token;
}
}
我是多线程的新手。是否有任何潜在的并发错误?这是实现这一目标的“标准/通用”方式吗?或者有没有更简单、更有效的方法?
【问题讨论】:
-
你不能只使用 java.util.concurrent.BlockingQueue 吗?
-
notify()在同步块中对我来说看起来很可疑(但不知道这是否有效或导致死锁) -
@Andreas_D:你不能用其他方式打电话给
notify(),你是什么意思可疑? (他的代码因其他原因而可疑,但不是那个原因。) -
@vanza 这是一个很好的建议。就我而言,我只需要一个元素缓冲区。 BlockingQueue 有类似的实现吗?
-
@vanza - google 上的一次快速浏览提醒我你是对的。 notify 必须在同步块内调用。
标签: java multithreading shared producer-consumer