高併發編程(一)

                                            高併發編程(一)

        概念:  

       併發:同時擁有兩個或多個線程,如果程序在單核處理器上運行,多個線程將交替地換入或者換出內存,這些線程是同時“存在”的,每個線程都處於執行過程中的某個狀態,如果運行在多核處理器上,此時,程序中的每個線程都將分配到一個處理器上,因此可以同時運行。

 

      高併發:高併發(High Concurrency)是互聯網分佈式系統架構設計中必須考慮的因素之一,它通常是指,通過保證系統能夠並行處理很多請求。

併發和高併發的側重點其實還是有一些細微的不同,在談到併發時候,我們側重於多個線程操作相同的資源,保證線程安全,合理利用資源。高併發是在系統運行的過程中短時間內遇到大量操作請求的情況,要求服務可以同時處理很多請求,提高程序性能。

 

        高併發編程基礎:

         CPU多級緩存

       爲什麼需要CPU cache : CPU的頻率太快了,快到主存跟不上,這樣在處理器時鐘週期內,CPU常常要等待主存,浪費資源。所以cache出現,是爲了緩解cpu和內存之間速度的不匹配問題(結構:cpu>cache>memory)

 

       CPU緩存有什麼意義

    1)時間侷限性:如果某個數據被訪問,那麼在不久的將來它很可能被再次訪問;

    2)空間侷限性:如果某個數據被訪問,那麼與它相鄰的數據很快也可能被訪問;

 

    緩存一致性協議(MESI)

    用於保證多個CPU cache之間緩存共享數據的一致

    亂序執行優化

    處理器爲提高運算速度而做出違背代碼原有順序的優化

 

       Java內存模型:

       

 Java虛擬機規範中試圖定義一種Java內存模型來屏蔽掉各種硬件和操作系統的內存訪問差異,以實現讓Java程序在各種平臺下都能達到一致性的內存訪問效果。

    Java內存模型主要目標是定義程序中各個變量的訪問規則,即在虛擬機中將變量存儲到內存和從內存中取出變量的操作底層細節。此處的變量(Variables)與Java編程中的變量有所區別,它包括了實例字段,靜態字段,和構成數組對象的元素,但不包括局部變量與方法參數,因爲後者是線程私有的,不會被共享,自然不會出現競爭問題。

    

 

java內存模型 - 同步八種操作

 

關主內存和工作內存之間的具體的交互協議,即一個變量如何從主內存拷貝到工作內存,如何從工作內存同步回主內存之類的實現細節,Java內存模型定義了以下8種操作來完成,虛擬機實現時必須保證下面的每一種操作都是原子的、不可再分割的。

    lock(鎖定):作用於主內存的變量,它把一個變量標識爲一條線程獨佔的狀態。

    unlock(解鎖):作用於主內存的變量,它把一個處於鎖定狀態之中的變量釋放出來,釋放出來後的變量可以被其他線程鎖定。

    read(讀取):作用於主內存的變量,它把一個變量的值從主內存傳輸到線程的工作內存中,以便後面load動作使用。

    load(載入):作用於工作內存的變量,它把read操作從主內存中得到的變量值放到工作內存的變量副本中。

    use(使用):作用於工作內存的變量,它把工作內存中一個變量的值傳遞給執行引擎,每當虛擬機遇到一個需要使用變量的值得字節碼指令時會執行這個操作。

    assin(賦值):作用於工作內存的變量,它將一個執行字節碼引擎接受到的值賦給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。

    store(存儲):作用於工作內存的變量,它把工作內存中一個變量的值傳送到主內存中,以便隨後的write操作使用。

    write(寫入):作用於主內存的變量,它把store操作從工作內存得到的變量的值放入到主內存中去。

 

java內存模型 - 同步規則

    

    不允許read和load、store和write操作之一單獨出現。

    不允許一個線程丟棄它的最近的assign操作,即變量變量在工作內存中改變了後必須把變化同步到主內存。

    不允許一個線程無原因地把數據從線程的工作內存同步到主內存。

    一個新的變量只能從主內存中“誕生”,不允許在工作內存中直接使用一個未被初始化的變量。

    一個變量在同一時刻只允許對其進行lock操作,但lock操作可以被同一個線程執行多次,多次執行後只有執行相同次數的unlock操作變量纔會被解鎖。

    如果對一個變量執行lock操作,那將會清空工作內存中此變量的值,在執行引擎使用這個變量之前,需要重新執行load或assin初始化變量的值。

    如果一個變量事先沒有被lock操作鎖定,那就不允許對它執行unlock操作,也不允許去unlock一個被其他線程鎖定住的變量。

    對一個變量執行unlock之前,必須先將此變量同步回主內存中。

  (詳情見JVM解析)...

 

併發的優勢與風險

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章