併發

併發

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

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

併發:多個線程操作相同的資源,保證線程安全,合理使用資源
高併發:服務能同時處理很多請求,提高程序性能

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

CPU cache有什麼意義:
1) 時間局部性:如果某個數據被訪問,那麼在不久的將來它很可能再次訪問
2) 空間局部性:如果某個數據被訪問,那麼與它相鄰的數據很快也可能被訪問

同步操作與規則
https://blog.csdn.net/zhanshenzhi2008/article/details/80216171
這裏寫圖片描述

內存間交互操作,其實就是關於主內存和工作內存之間具體的交互協議,即一個變量如果從主內存拷貝到工作內存,如果從工作內存同步回豬內存之內的實現細節。Java內存模型定義以下8中操作來完成。

Lock

主內存變量標記成一個線程獨佔的狀態

Unlock

將主內存一個鎖定的狀態變量給釋放出來,釋放後的變量可以被其他線程鎖定

Read

將主內存的變量,它把一個變量的值從主內存傳輸到線程的工作內存中,便於後面的load使用。

Load

將把Read操作從主內存中得到的變量值放入到工作內存的變量副本里。

Use

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

Assign

把一個從執行引擎接受到的值給工作內存變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。

Store

把工作內存的一個變量值傳送到主內存中,以便隨後的write操作使用。

Write

把store操作從工作內存中得到的變量的值放入到主內存中的變量中。

從以上8中操作可以看出,如果需要變量將主內存複製到工作內存,那麼就要順序執行read load操作,如果把變量從工作內存同步回主內存,則需要順序執行store write操作。但是,雖然是順序執行,但不代表是連續執行。也就是說,read—–>load, store——>write之間的操作,可以插入其他指令的,如對主內存中的變量a、b進行訪問時,一種可能出現的順序是read a —->read b—> load b—>load a .

Java內存模型規定了在執行這8種基本操作時必須滿足如下規則:

不允許read和load、store和write單獨出現。即不允許一個變量從主內存讀取了但工作內存不接受,或者從工作內從發起會寫了但主內存不接受的情況出現。
不允許一個線程丟棄它的最近的assign操作,即變量在工作內存中改變了之後必須把該變化同步到主內存裏。
不允許一個線程無原因地把數據從線程工作內存同步回主內存中,即沒有發生過任何的assign操作就同步到主內存中。
一個新的變量只能在主內存中誕生,不允許在工作內存中直接使用一個沒有被初始化(load或assign)的變量,換句話說,就是對一個變量實施use、store操作之前,必須先執行assign和load操作。
一個變量在同一時刻,只允許一個線程對其進行loack操作,但lock操作可以被同一個線程重複執行多次,多次執行lock後,只有執行相同次數的unloack操作,變量才能被解鎖。
如果對一個變量執行了lock操作,那將會清空工作內存中此變量的值,在執行引擎使用這個變量前,需要重新執行load或assign操作初始化變量的值。
如果一個變量事先沒有被lock操作鎖定,那就不允許對他執行unlock操作,也不允許去unlock一個被其他線程鎖定住的變量
對一個變量執行unlock操作之前,必須先把此變量同步回主內存中(執行store、write操作)。

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