Java 的另一個經典書籍之一《Java 併發編程的藝術》你們確定也是看過的,今天開始我按照個人理解通俗的講解這本書。算法
首先併發編程的目的就是讓程序跑的更快,可是並非開啓更多的線程就能讓程序就能最大限度的併發執行,在實際的併發編程中,還會面臨這不少的挑戰,例如:上下文切換、死鎖問題、硬件、軟件的資源受限所帶來的問題。數據庫
一、1 上下文切換編程
CPU經過給每一個線程分配CPU時間片來執行多個線程,時間片通常很是的短,CPU經過不斷的切換線程執行,因此讓咱們感受多個線程是併發同時進行的,可是實際上並非的。當前的任務執行了一個時間片後,保存當前的狀態以便下一次再加載這個任務的狀態,而後切換當下一個任務。因此任務從保存到再加載的過程就是一次上下文切換。然而上下文切換是須要時間的,會影響多線程的執行效率。多線程
如何減小上下文切換併發
一、無鎖併發編程。多線程競爭鎖時,會引發上下文切換,沒有競爭到鎖的線程,一直處於等待狀態,因此上下文切換的時間會比較長。因此可使用一些方法避免使用鎖。例如數據的ID利用Hash算法取模,不一樣的線程取不一樣的數據段。工具
二、CAS 算法。Java 的Atomic包就是使用的CAS算法更新數據,而不加鎖。性能
三、使用最少線程。避免建立沒必要要的線程。.net
四、協程。協程看上去也是子程序,但執行過程當中,在子程序內部可中斷,而後轉而執行別的子程序,在適當的時候再返回來接着執行。最大的優點就是協程極高的執行效率。由於子程序切換不是線程切換,而是由程序自身控制,所以,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優點就越明顯。第二大優點就是不須要多線程的鎖機制,由於只有一個線程,也不存在同時寫變量衝突,在協程中控制共享資源不加鎖,只須要判斷狀態就行了,因此執行效率比多線程高不少。線程
一、2 死鎖協程
在併發編程中很容易出現死鎖,一旦出現死鎖,系統功能就不能使用,書中介紹幾種常見避免死鎖的方式。
一、避免一個線程同時得到多個鎖
二、保證一個鎖只佔用一個資源
三、嘗試使用定時鎖
四、數據褲鎖,加鎖和解鎖i必須在同一個數據庫鏈接中
一、3 資源限制的挑戰
硬件資源的限制:能夠用集羣執行程序
軟件資源的限制:使用鏈接池資源的複用
總結:
併發編程寫的不嚴謹很容易出現問題、並且定位不太容易,因此書中建議多使用JDK併發包提供的併發容器和工具類來解決併發問題。
參考:http://blog.csdn.net/wusd1256/article/details/78160552