我正在尝试在java中创建线程安全队列。我遇到过这个例子:
class ProducerConsumer<T> {
private static final int BUFFER_MAX_SIZE = 42;
private List<T> buffer = new LinkedList<>();
synchronized void produce(T value) throws InterruptedException {
while (buffer.size() == BUFFER_MAX_SIZE) {
wait();
}
buffer.add(value);
notify();
}
synchronized T consume() throws InterruptedException {
while (buffer.size() == 0) {
wait();
}
T result = buffer.remove(0);
notify();
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我是java新手。据我了解,这两个“同步”关键字将防止每个方法内部发生争用,但当同时调用两个方法时则不会。例如,线程P调用product、locks方法,线程C调用consume、locks其他方法,然后一个尝试从列表中提取元素,另一个尝试插入元素,就会出现线程异常。
我的问题:这个例子坏了吗?
或者也许我错过了一些东西,但没关系。