1. 程式人生 > >Java並發編程(一)-為什麽要並發

Java並發編程(一)-為什麽要並發

是否 退出 line 但是 英雄聯盟 編程 ati 效果 執行順序

並發所帶來的好處

1. 並發在某些情況(並不是所有情況)下可以帶來性能上的提升

1) 提升對CPU的使用效率

  提升多核CPU的利用率:一般來說一臺主機上的會有多個CPU核心,我們可以創建多個線程,理論上講操作系統可以將多個線程分配給不同的CPU去執行,每個CPU執行一個線程,這樣就提高了CPU的使用效率。

  提升訪問I/O時CPU的利用率:當一個線程要在網上下載一些東西的時候,這個線程將處於阻塞狀態,這時CPU就不會再為這個線程分配CPU時間了,而其他進程可以不受任何影響地獲得CPU時間。反過來如果沒有使用並發,當前面的指令申請I/O資源的時候,整個進程就被掛起了,即使CPU處於空閑狀態後面的指令也不能被執行。

2) 降低系統的響應時間

  設想一個服務器同時有一萬個用戶訪問,如果使用單線程,所有用戶的請求就會進入到一個隊列中排隊,如果我恰巧是第9999個(從0開始數的)用戶,那麽我要等到前面9999個用戶的請求都處理完成的時候服務器才會給我響應,我的用戶體驗將會非常的差。如果使用多線程處理就可以回避響應時間過長的問題,用戶可以輪流使用CPU資源,用戶可能沒有始終占用系統,但是不論用戶訪問服務器的順序如何,每個用戶都可以很快得到用戶的響應。

3)提升系統的容錯能力

  一個線程可以不受其他線程的幹擾獨立運行,如果某個線程的代碼裏出現了Bug,這個線程可能拋出異常退出了,這時候其他線程可以不受任何影響繼續執行。

2. 方便編寫代碼——仿真

  英雄聯盟這個遊戲應該很多人都聽說過,這是一款在商業上很成功的5V5對戰遊戲,這個遊戲裏面有一個很“經典”的遊戲模式:人機對戰。5個電腦控制的英雄就是用至少(這個至少只是為了嚴謹而已)5個線程實現的。5個英雄仿佛都有自己的想法,以下就是它大致的策略偽代碼:

技術分享圖片

  每個線程各自執行自己的策略,他們之間也可以通過線程之間交互實現各個英雄之間的技能配合。如果使用單線程實現5個英雄的策略則異常的艱難。

並發的弊端

  編寫並發代碼容易出錯,多線程並發運行給執行過程帶來了很多不確定性,因為只有同一個線程內部代碼的執行順序是固定的,而不同線程之間的代碼執行順序無法確定。當多個線程之間互相幹擾時,問題就會接踵而至。編寫多線程代碼時,如果沒有考慮全面很容易產生概率性的、難以復現的Bug。

  系統進行線程上下文切換時會消耗少量的系統資源,例如在邊寫作業邊玩手機的時候,在拿起筆和拿起手機的操作需要占用時間,回想剛才做題的時候的思路也有占用時間,如果先寫完作業再專心玩手機可能會取得更好的效果。

總結

  並發並不是完美的,是否使用並發也要結合實際情況權衡利弊。隨著CPU核心和系統的用戶數量的增長,多線程的應用越來越廣泛。在絕大多數情況下多線程所帶來的弊端在其優點面前都顯得微不足道。

Java並發編程(一)-為什麽要並發