Java中的多執行緒(五大經典同步問題Scenario等)
阿新 • • 發佈:2019-02-19
What
A thread is a lightweight sub process, a smalleset unit of processing. It is a separate path of execution. 每個執行緒是獨立的,如果一個執行緒發生了異常是不會影響到另外的執行緒的。但是同一個程序的所有執行緒都共享同一塊記憶體。下圖可以幫助理解一下。
(https://www.javatpoint.com/multithreading-in-java)
關於多執行緒有以下幾個方面是需要掌握的知識點:
1.執行緒同步
2.執行緒間通訊
3.執行緒死鎖
4執行緒控制:掛起、停止和恢復。
接下來有五大經典同步問題:
1. 生產者-消費者問題
有一個buffer, 生產者生產產品之後放入這裡,消費者從這個buffer取出產品,我們要確保當buffer滿了,生產者不放入產品,當buffer空了,消費者不取出產品。實現的大概流程如下:
當buffer滿了,生產者就去sleep,一直當有消費者從buffer中取出產品,在notify生產者,繼續生產。當buffer空了,消費者進入sleep, 當生產者又生產了產品,就去notify消費者,讓消費者可以取出產品。如果處理不好,就會產生死鎖,比如說兩個人都sleep了,再也沒有一方可以被喚醒。一般來說,使用程序間通訊,加入一個訊號標的概念(semaphore)來解決這個問題。
這個問題是最終看了youtube上面的公開課理解的。自己在紙上多畫畫圖,多跟著整體思路走一走,就會很好理解。