Java多執行緒可見性(一)

2021-08-13 01:06:19 字數 696 閱讀 3649

一:記憶體可見性

執行緒對共享變數的修改,可以及時的被其他執行緒看到。

那何為共享變數呢?就是在多個執行緒的工作記憶體中存在

如下圖所示:所謂的共享變數就是主記憶體中名為s的變數,程式中所有的變數都會儲存在主記憶體中;其他執行緒也會有自己的工作記憶體,此工作記憶體的作用是為執行緒與主記憶體之間建立橋梁

由此圖總結如下:

1:其他執行緒不可以直接訪問主記憶體中的變數,必須先與自己的工作記憶體進行互動再由工作記憶體與主記憶體進行互動。

2:不同執行緒之間無法直接訪問其他執行緒工作記憶體中的變數,執行緒間變數值的傳遞需通過主記憶體來完成。

3:主記憶體作為其他執行緒之間相互動的橋梁,執行緒1中更改共享變數想被其他執行緒及時看到,則需要工作記憶體1將更新的值重新整理到主記憶體中,由主記憶體將最新的共享變數值更新到工作記憶體2中

如下圖所示:

二:可見性實現方式

1:synchronized

執行緒解鎖:退出synchronized**塊時,主記憶體中的共享變數為最新值

執行緒加鎖:進入synchronized**塊時,清空工作記憶體中共享變數的值,從而使用時從主記憶體中重新讀取最新值

注:執行緒解鎖前對共享變數的修改在下次加鎖時對其他執行緒可見

實現可見性步驟:

獲取互斥鎖 - - >清空工作記憶體 –>從主記憶體拷貝變數的最新副本到工作記憶體 –>執行** –>將更改後的共享變數重新整理到主記憶體 – >釋放互斥鎖

多執行緒學習 執行緒可見性

每個執行緒都有自己的空間去暫存資料 當有乙份資料在a,b執行緒之間共享 那麼在a執行緒中改變了b是不會馬上知道的 example 共享物件 多個物件在沒有同步的情況下會發生可見性的錯誤 public class sharingobjects1 system.out.println thread th...

java多執行緒 執行緒之間的可見性

目錄 一 簡介 二 volatile 三 synchronized 四 不會從主記憶體拉取的操作 五 從主記憶體中拉取的操作 我們知道執行緒在工作的時候有自己的私有記憶體,工作記憶體。程式執行的時候從主記憶體拉取需要的變數到工作記憶體,處理完再返回主記憶體。這篇文章總結哪些 會使執行緒去主記憶體拉取...

JAVA多執行緒 共享變數的可見性問題

我們知道執行緒在工作的時候有自己的私有記憶體,工作記憶體。程式執行的時候從主記憶體拉取需要的變數到工作記憶體,處理完再返回主記憶體。這篇文章總結哪些 會使執行緒去主記憶體拉取變數。volatile修飾的變數,不論什麼語句都會從主記憶體拉取變數。該程式能順利完成,不會死迴圈。因為 isstop 用vo...