1. 程式人生 > >併發程式設計學習:java併發程式設計的藝術(一)

併發程式設計學習:java併發程式設計的藝術(一)

一:

1.併發與並行:併發是多個執行緒(任務)共同爭奪一個cpu進行處理,並行是多個cpu各自處理對應的執行緒任務,現階段都只是併發而不是真正意義上的並行。

2.上下文切換:

     即使單行處理器也支援多執行緒執行任務,cpu通過給每個執行緒分配cpu時間片來實現這個機制。時間片是cpu分配給各個執行緒的時間,時間片非常短,所以cpu通過不停地切換執行緒執行,感覺像是多個執行緒同時執行,時間片一般是幾十毫秒

     cpu通過時間片分配演算法來迴圈執行任務,當前任務執行完一個時間片會切換到下一個任務。在切換前會儲存上一個任務的狀態,以便下次切換回這個任務,可以再載入這個任務的狀態,所以任務從儲存到再載入的過程就是一次上下文切換。

3.普通情況下的效率:

     當併發執行累加操作不超過百萬次時,速度會比序列執行累加操作要 慢。這是因為程有建立和上下文切換的開銷。

4. 如何減少上下文切換 :

        減少上下文切換的方法有無鎖併發程式設計、CAS演算法、使用最少執行緒和使用協程。 ·無鎖併發程式設計。多執行緒競爭鎖時,會引起上下文切換,所以多執行緒處理資料時,可以用一 些辦法來避免使用鎖,如將資料的ID按照Hash演算法取模分段,不同的執行緒處理不同段的資料。 ·CAS演算法。Java的Atomic包使用CAS演算法來更新資料,而不需要加鎖。 ·使用最少執行緒。避免建立不需要的執行緒,比如任務很少,但是建立了很多執行緒來處理,這 樣會造成大量執行緒都處於等待狀態。 ·協程:在單執行緒裡實現多工的排程,並在單執行緒裡維持多個任務間的切換

二:Java併發機制的底層實現原理

     簡介:Java程式碼在編譯後會變成Java位元組碼,位元組碼被類載入器載入到JVM裡,JVM執行位元組 碼,最終需要轉化為彙編指令在CPU上執行

2.1 volatile的應用: