今天剛畢業的新人問我關於多線程的問題,由於我也沒有理解透徹,一時沒有解釋清楚,如今細想類比蕃茄炒蛋,整理了下:安全
IIS是一個天生的多線程程序。
比如,一個訂單請求過來,就放出一個廚師作蕃茄炒蛋,再來一個新訂單,再放一個廚師出來作蕃茄炒蛋。廚師作完菜,就回房休息。
由於是多個CPU,多核,能夠安排N個廚師同時幹活。每一個廚師參照同一份菜譜(程序代碼)作菜,各自記下本身的步驟。
若是仍是嫌上菜速度太慢,那就要修改菜譜,原來的菜譜是對針對一口鍋寫的,如今咱們拿來兩口鍋。
原來的菜單相似於這樣:
第一步:準備好一隻蛋,和一隻蕃茄。
第二步:把蛋放在鍋裏燒1分鐘+,起鍋拿出蛋。
第三步,把蕃茄放在鍋裏燒1分鐘+,混入炒蛋。
第四步,翻炒1分鐘後起鍋。多線程
改進後的新菜單相似於這樣:
第一步:準備好一隻蛋,和一隻蕃茄。
第二步:同時點火兩口鍋,分別放入蛋和蕃茄,各燒1分鐘+。
第三步,看蛋先熟仍是蕃茄先熟,先熟的食材的鍋先安排熄火。
第四步,待慢熱的另外一個食材也燒熟後,將兩種食材混和翻炒,而後起鍋。線程
如今每一個廚師拿到新的菜譜後開工,工做效率明顯提高了,每份蕃茄炒蛋大約省下1分鐘的時間。指針
值得注意的是,廚師們仍是隻參考同一份菜譜,並無各自複印,但他們各自幹活時會記下各自的工做進度(指令指針和私有變量)。
兩口鍋工做時,鍋裏的食材不同,進度不同,可是仍是參考同一份菜譜,各自關注鍋內食材的成熟度(指令指針和私有變量)。
廚房的排風扇,水龍頭,電燈,燃氣,是全部人共享的。
電燈你們都用,下班後最後走的那我的關燈,不會衝突,沒有問題。
燃氣分別爲每口鍋各自提供接入,各自開關,不會衝突,沒有問題。
水龍頭每一個人都要用到,並且一個水龍頭你們共用,只能一我的接水,這就很容易發生水資源搶佔的問題。
最糟糕的狀況時,我正準備接水的時候,別人高處截流,致使我一直接不到水,結果雞蛋炒糊了,油鍋都起火了,這就很不安全了。
因此多線程程序會額外引入資源分配,線程同步的問題。
一般的作法是,協調好廚師們用水的方式,好比約定排隊取水,先到先得,用完即走。資源