音乐电台 2020-09-11 16:37 采纳率: 100%
浏览 98
已采纳

萌新求问,大佬们看下这个为什么会偶尔出现数组越界的情况?

#生产者和消费者应当共用container的count,但是会偶尔出现数组下标越界和count不匹配

import java.awt.*;

public class Part6_TestProducerConsumer_1 {
    public static void main(String[] args) {
        //生产者和消费者必须共用一个容器
        SynContainer container = new SynContainer();
        Producer producer = new Producer(container);
        Consumer consumer = new Consumer(container);
        new Thread(producer,"生产者").start();
        new Thread(consumer, "消费者").start();
    }
}

class Chicken{
    int id;//鸡的序列号
    public Chicken(int id) {
        this.id = id;
    }
}

class Producer implements Runnable{
    SynContainer container;

    public Producer(SynContainer container) {
        this.container = container;
    }

    @Override
    public void run() {
        for (int i = 1; i < 100; i++) {
            try {
                container.putIn(new Chicken(i));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("生产者生产了第" + i + "只鸡," + "仓库中还有" + container.count + "只鸡");
        }
    }
}

class Consumer implements Runnable{
    SynContainer container;

    public Consumer(SynContainer container) {
        this.container = container;
    }

    @Override
    public void run() {
        for (int i = 1; i < 100; i++) {
            try {
                container.takeOut();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("消费者消费了第" + i + "只鸡," + "仓库中还有" + container.count + "只鸡");
        }
    }
}

class SynContainer{
    Chicken[] chickens = new Chicken[10];//定义容器中可以装鸡的数量
    int count = 0;//记录目前容器持有数量

    public synchronized void putIn(Chicken chicken) throws InterruptedException {
        //如果容器已满,停止生产,等待消费
        if(count == chickens.length){
            this.wait();
        }
        //如果容器不满
        chickens[count] = chicken;
        count ++;
        //通知消费者消费
        this.notifyAll();
    }

    public synchronized Chicken takeOut() throws InterruptedException {
        //如果容器为空,停止消费,等待生产
        if(count == 0){
            this.wait();
        }
        //如果容器不为空
        Chicken getChicken = chickens[count];
        count --;
        //通知生产者生产
        this.notifyAll();
        return getChicken;
    }
}
  • 写回答

2条回答 默认 最新

  • 半路出码 2020-09-11 17:28
    关注

    count ++;count --; 都不是原子操作的。换成AtomicInteger

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 用matlab求微分方程初值问题
  • ¥15 vscode下编写第三方库opencv与pcl代码时没有代码提示
  • ¥15 能够跑通不报错,如何解决?(标签-matlab)
  • ¥15 MOS在RDS较大,频率高时开关波形异常
  • ¥15 SCENIC分析报错求解答
  • ¥15 ceph初始化mon不成功 下图不报错 这个是什么元
  • ¥15 数学建模数学建模少ai
  • ¥35 这个等效电路图是什么意思?(答疑)(有没有不是chat的,我就是在chat搜不到才来问的,chat还开了VIP)(可以追加酬金)
  • ¥200 基于同花顺supermind的量化策略脚本编辑
  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?