第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

對單個(gè)靜態(tài)整數(shù)索引進(jìn)行多次讀寫會導(dǎo)致索引越界

對單個(gè)靜態(tài)整數(shù)索引進(jìn)行多次讀寫會導(dǎo)致索引越界

富國滬深 2023-07-13 17:45:51
我試圖學(xué)習(xí)多線程,并嘗試使用等待和通知的簡單生產(chǎn)者/消費(fèi)者模式。當(dāng)我將模式拆分為兩個(gè)消耗和一個(gè)產(chǎn)生時(shí),我得到一個(gè) ArrayIndexOutOfBounds 異常,該異常尚不清楚。該問題并不總是發(fā)生,有時(shí)會發(fā)生。我使用的是 I3 處理器。我嘗試添加一個(gè) if 塊來檢查計(jì)數(shù)變量是否低于或高于聲明的大小,但問題仍然存在。    private static Object key = new Object();    private static int[] buffer;    private volatile static Integer count;    static class Consumer {        void consume() {            synchronized (key) {                if (isEmpty()) {                    try {                        key.wait();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }                buffer[--count] = 0;                key.notify();            }        }        public boolean isEmpty() {            return count == 0;        }    }    static class Producer {        void produce() {            synchronized (key) {                if (isFull()) {                    try {                        key.wait();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }                buffer[count++] = 1;                key.notify();            }        }        public boolean isFull() {            return count == buffer.length;        }    }    public static void main(String[] args) throws InterruptedException {        buffer = new int[10];        count = 0;        Producer producer = new Producer();        Consumer consumer = new Consumer();        Runnable produce = () -> {            for (int i = 0; i < 1500; i++)                producer.produce();            System.out.println("Done producing");        };        Runnable consume = () -> {            for (int i = 0; i < 1300; i++)                consumer.consume();            System.out.println("Done consuming");        };        };
查看完整描述

2 回答

?
拉莫斯之舞

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊

問題是:

  • 對于“滿”和“空”狀態(tài),您只有一個(gè)共享的等待條件

  • 您正在運(yùn)行兩個(gè)消費(fèi)者線程(“consumerWorker”和“delayedConsumer”)和一個(gè)生產(chǎn)者線程(“ ProducerWorker”)

  • 你沒有像你應(yīng)該的那樣重新檢查 while 循環(huán)中的條件

可能發(fā)生的事情是:

  1. 兩個(gè)消費(fèi)者線程都看到緩沖區(qū)為空

  2. 生產(chǎn)者線程將一項(xiàng)放入緩沖區(qū)并發(fā)出通知。

  3. 單個(gè)消費(fèi)者線程喚醒并處理一項(xiàng)。緩沖區(qū)現(xiàn)在是空的。然后它會發(fā)出通知。

  4. 第二個(gè)消費(fèi)者線程醒來(而不是像您預(yù)期的那樣的生產(chǎn)者),不檢查緩沖區(qū)是否為空,并嘗試訪問索引 -1 處的緩沖區(qū)。

您從通話中醒來后需要重新檢查情況wait。將 更改ifwhile.?以下是如何為消費(fèi)者做到這一點(diǎn);您需要為制作人做同樣的事情。

? ? void consume() {

? ? ? ? synchronized (key) {

? ? ? ? ? ? while (isEmpty()) {

? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? key.wait();

? ? ? ? ? ? ? ? } catch (InterruptedException e) {

? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? buffer[--count] = 0;

? ? ? ? ? ? key.notify();

? ? ? ? }

? ? }

這樣消費(fèi)者就不會被來自notify其他消費(fèi)者線程的 所迷惑。


查看完整回答
反對 回復(fù) 2023-07-13
?
函數(shù)式編程

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊

你的緩沖區(qū)長度為 10

buffer = new int[10];

因此,每當(dāng)您的計(jì)數(shù)變量超過數(shù)組容量(即 10)時(shí),就會很明顯

    private volatile static Integer count;

你會得到ArrayIndexOutOfBoundsException

您生產(chǎn)更多,消耗更少,消耗更少,并且生產(chǎn)/消費(fèi)的執(zhí)行不是順序的,它更像是循環(huán)。


查看完整回答
反對 回復(fù) 2023-07-13
  • 2 回答
  • 0 關(guān)注
  • 139 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號