小编Upr*_*ted的帖子

java,在两个单独的方法中同步?

我正在尝试在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其他方法,然后一个尝试从列表中提取元素,另一个尝试插入元素,就会出现线程异常。

我的问题:这个例子坏了吗?

或者也许我错过了一些东西,但没关系。

java multithreading

0
推荐指数
1
解决办法
117
查看次数

标签 统计

java ×1

multithreading ×1