生產者消費者問題 lock

2022-06-29 02:57:24 字數 2190 閱讀 8355

# **:

public

class

public

static

void

main(string args)

}class

producer

public

void produce(final

intval)

}.start();

}}class

consumer

public

void consume(final

intval)

}.start();

}}class

depot

public

void produce(int

val)

int incre = (size + surplus) > capacity ? (capacity -size) : surplus;

size +=incre;

surplus -=incre;

system.out.printf("%s plan to produce (%d), actually produce (%d), depot size (%d) \n",

thread.currentthread().getname(), val, incre, size);

emptycondition.signal();}}

catch

(interruptedexception e)

finally

}public

void consume(int

val)

int desc = (size < surplus) ?size : surplus;

size -=desc;

surplus -=desc;

system.out.printf("%s plan to consume (%d), actutally consume (%d), depot size (%d) \n",

thread.currentthread().getname(), val, desc, size);

fullcondition.signalall();}}

catch

(interruptedexception e)

finally

}}

# 輸出:

thread-0 plan to produce (60), actually produce (60), depot size (60)

thread-1 plan to consume (100), actutally consume (60), depot size (0)

thread-2 plan to produce (90), actually produce (90), depot size (90)

thread-3 plan to consume (40), actutally consume (40), depot size (50)

thread-1 plan to consume (100), actutally consume (40), depot size (10)

# 有四個執行緒參與了這個過程,兩個生產者,兩個消費者

# 這是幾個月之後的補充。。。。。。。。手動笑哭。

# 幾個月之後,我重新回顧了這些內容。。。發現了上面的**有坑!!!

# 首先我們來重現此坑

public

static

void

main(string args)

for (int i = 0; i < 50; i++)

}

- main 方法是這個樣子,在這種情況下,有時候會出現程式卡住的情況

- 用jstack看了一下堆疊資訊,發現有幾個consumer執行緒一直處於locked狀態,但是已經沒有人去喚醒他們了

- 分析了一下,其實原因很明顯,我們在produce時,喚醒consumer使用的是signal(),最後乙個生產者在喚醒某乙個消費者之後,該消費者消費完了就再也沒有生產者了,這時剩下的消費者執行緒就沒有人喚醒他們了。。。換成signalall()就ok了。

# 還有乙個需要注意的是進入 await()的判斷條件一定要使用while, 盡量不要使用if, 這個問題我會在 synchronized 實現的生產者-消費者模組中給出原因

生產者消費者問題

public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...

生產者 消費者問題

在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...

生產者 消費者問題

1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...