音乐电台 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 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题