You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java两个独立方法均加synchronized,该生产者消费者示例是否有问题?

你对synchronized关键字的作用理解存在偏差,这段示例代码是可以正常运行的,不存在你担心的线程安全问题。

核心知识点:非静态方法的synchronized锁的是对象实例

Java中给普通非静态方法加synchronized修饰时,锁的是当前方法所属的对象实例(也就是this),不是锁的方法本身。也就是说,只要是同一个ProducerConsumer类的实例,不管是调用produce还是consume方法,都需要先拿到该实例的对象锁,同一时间最多只有一个线程能进入这两个方法中的任意一个,完全不会出现produce和consume同时执行的情况。

这段代码的运行逻辑是自洽的

  • 生产者调用produce时,如果队列已满,就会调用wait()方法,这个方法会自动释放当前持有的对象锁,然后进入等待状态,此时消费者线程就可以拿到锁执行consume方法消费元素。
  • 消费者消费完成后调用notify(),会唤醒一个在当前对象上等待的线程(大概率是阻塞的生产者),被唤醒的线程会重新竞争对象锁,拿到锁之后会继续从wait()的位置往下执行,并且会再次通过while循环判断队列状态,避免虚假唤醒问题。
  • 消费者侧的wait()逻辑同理,队列为空时释放锁等待生产者生产。

小优化点(不影响正确性)

如果你的场景会有多个生产者、多个消费者同时运行,这段代码用notify()可能会出现唤醒同类线程的情况(比如生产者唤醒另一个生产者,消费者唤醒另一个消费者),虽然有while循环的判断不会出逻辑错误,但会损失一点性能,这种场景下把notify()改成notifyAll()会更合适。

内容的提问来源于stack exchange,提问作者Uprooted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:24:03