Java同一资源下多线程同步问题:生产者消费者代码未按预期交替执行
单槽位生产者-消费者模型同步异常问题
预期目标
实现两个线程操作同一个共享资源,严格按照“生产1个数据、消费1个数据”的节奏交替执行,预期输出顺序为:
Producer -> Setting data = 0 Consumer -> Getting data = 0 Producer -> Setting data = 1 Consumer -> Getting data = 1 Producer -> Setting data = 2 Consumer -> Getting data = 2 Producer -> Setting data = 3 Consumer -> Getting data = 3 Producer -> Setting data = 4 Consumer -> Getting data = 4
现有实现
共享资源类Resource
在读写方法中已经添加了synchronized同步锁、wait()等待逻辑、notifyAll()唤醒逻辑,代码如下:
public class Resource{ private int value; private boolean current = false; public synchronized void setValue(int val) { while(current == true) { try { wait(); }catch(Exception ex) {}} value = val; current = true; notifyAll(); } public synchronized int getValue() { while(current == false) { try { wait(); }catch(Exception ex) {}} current = false; notifyAll(); return value; } }
生产者、消费者与启动入口
class Producer extends Thread{ private Resource rs; public Producer(Resource rs1) { rs = rs1; } public void run() { for(int i = 0 ; i < 5 ; i++) { rs.setValue(i); System.out.println("Producer -> Setting data = " + i); try { sleep(100); }catch(Exception ex){ ex.printStackTrace(); } } } } class Consumer extends Thread{ private Resource rs; public Consumer(Resource rs1) { rs = rs1; } public void run() { int value = 0; for(int i = 0 ; i < 5; i++) { value = rs.getValue(); System.out.println("Consumer -> Getting data= " + i); try { sleep(100); }catch(Exception ex) { ex.printStackTrace(); } } } } public class Dependent { public static void main(String[] args) throws IOException { Resource res = new Resource(); Producer p1 = new Producer(res); Consumer c1 = new Consumer(res); p1.start(); c1.start(); } }
实际运行遇到的问题
- 虽然已经按照Java书籍上的示例写了同步逻辑,但两个线程无法按照预期互相等待、交替执行,输出顺序不符合要求。
- 曾尝试去掉
current布尔标志位,代码完全无法正常运行,因此参考示例补充了该字段,不确定是否必须依赖该标志位才能完成线程同步。
内容的提问来源于stack exchange,提问作者brkcnbaz
相关产品推荐
相关产品推荐

