併發是一種可以並行運行多個程序或並行運行一個程序中多個部分的能力。若是程序中一個耗時的任務能以異步或並行的方式運行,那麼整個程序的吞吐量和可交互性將大大改善。現代的PC都有多個CPU或一個CPU中有多個核。是否能合理運用多核的能力將成爲一個大規模應用程序的關鍵。web
在不啓動多線程的狀況下讓程序執行的更快。若是以啓動多線程的方式讓程序運行的更快就面臨如下幾個問題:算法
上下文切換:數據庫
有時也稱做進程切換或者任務切換,是指CPU 從一個進程或線程切換到另外一個進程或線程。即便是單核處理器也支持多線程執行代碼,因此須要CPU經過時間片分配算法來循環執行任務,當前任務執行一個時間片後會切換到下一個任務,可是在切換前會保存上一個任務的狀態,以便在下次回到這個任務時,能夠再加載到這個狀態。就如同咱們同時閱讀幾本書,在來回切換書本的同時咱們須要記住每本書當前讀到的頁碼。在程序中,上下文切換過程當中的「頁碼」信息是保存在進程控制塊 (PCB)中的。PCB還常常被稱做「切換楨」(switchframe)。「頁碼」信息會一直保存到CPU的內存中,直到他們被再次使用。編程
死鎖 :多線程
指兩個或兩個以上的進程在執行過程當中,因爲競爭資源或者因爲彼此通訊而形成的一種阻塞的現象。避免死鎖的幾個主要方式:(1)避免一個線程同時獲取多個鎖 (2)避免一個線程在鎖內同時佔用多個資源。儘可能保證每一個鎖只佔用一個資源。 (3)使用定時所lock.tryLock(timeout)來代替內部鎖機制。(4)對於數據庫鎖,加鎖和解鎖必須在一個數據庫鏈接裏,不然會形成解鎖失敗。
併發
硬件和軟件的資源限制 :異步
硬件限制有寬帶的上傳/下載速度、硬盤讀寫速度和CPU處理速度;軟件有數據庫鏈接數和socket連接數。由於在併發編程中,將代碼執行速度加快的原則是將代碼中串行執行部分變成併發執行,可是若是由於受資源限制緣由,增長了上下文切換和資源調度時間,就會使程序執行變得更慢。socket
對於硬件資源限制,能夠考慮使用集羣並行執行程序,在多機上運行。對於軟件資源的限制,能夠考慮使用資源池將資源複用。好比使用鏈接池將數據庫和Socket鏈接複用,或者在調用對方webService接口,只創建一個連接。
spa