java併發程式設計的藝術 三 三 記憶體語義

2021-08-11 08:47:41 字數 789 閱讀 9447

volatile的記憶體語義

可見性:對於乙個volatile變數的讀,總能看見任意執行緒對volatile變數最後的寫。

原子性:對於任意單個volatile變數的讀寫具有原子性,但對於符合操作不具有原子性。

當寫volatile變數時,jvm會把執行緒中對用的本地存貯重新整理到記憶體。

讀取volatile變數時,jvm會把本地存貯的值置為無效,讀取記憶體中的值。

volatile記憶體語義的實現

storestore屏障 volatile寫操作 storeload屏障

volatile寫操作 loadload屏障 loadstore屏障

鎖的記憶體語義

釋放鎖的時候,jvm把執行緒本地存貯重新整理到記憶體中。

獲取鎖的時候,jvm會把執行緒對應的本地記憶體置為無效,而迫使被監視器保護的臨界區**必須從主記憶體中讀取共享變數。

鎖記憶體語義的實現

1>利用volatile變數的讀寫記憶體語義

2>利用cas所附帶的volatile讀和volatile寫的記憶體語義。

ps:cas同時具有volatile讀-寫的記憶體語義。

對於final域,編譯器和處理器要遵守兩個重排序規則。

1,對於建構函式對final域的寫入,在隨後這個被構造的物件的引用賦值給乙個引用變數,這兩個操作之間不能重排序。

2,初次讀取乙個包含final域的物件的引用,於隨後初次讀取這個final域,這兩個操作之間不能重排序。

Java併發程式設計的藝術 筆記

併發存在的問題 上下文切換耗時,死鎖,軟硬體資源限制 解決方法 減少上下文切換 1.無鎖併發程式設計 讓不同的執行緒處理不同的資料段 將資料id採用hash演算法分配給不同的執行緒 2.cas演算法 compare and set使用jni 3.使用最少執行緒 減少處於waiting狀態的執行緒 j...

java併發程式設計的藝術(六) AQS

aqs是佇列同步器 abstractqueuesynchronizer 是用來構建鎖和完成其他同步元件的基本框架,再lock裡面,很多的方法都將用到aqs以獲取同步狀態,實現鎖的語義,而不是依靠傳統的synchronized中的物件進行鎖獲取與釋放。aqs的核心思想是基於volatile int s...

Java併發程式設計的藝術 筆記2

現代作業系統排程的最小單位是執行緒,也叫輕量級程序,每個程序可建立多個程序,每個執行緒都有各自的計數器 堆疊和區域性變數等屬性,並且能夠訪問共享變數。處理器在這些執行緒上高速切換,讓使用者感覺到這些執行緒在同時執行。執行緒優先順序 決定執行緒分配處理器資源多少的屬性,設定時,針對頻繁阻塞 休眠或i ...