You need to enable JavaScript to run this app. Java同一资源下多线程同步问题:生产者消费者代码未按预期交替执行
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 09:24:04