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

2021-09-01 02:09:06 字數 1018 閱讀 7990

每個執行緒都有自己的空間去暫存資料

當有乙份資料在a,b執行緒之間共享

那麼在a執行緒中改變了b是不會馬上知道的

example

/**

* 共享物件

* 多個物件在沒有同步的情況下會發生可見性的錯誤

*/public class sharingobjects1

system.out.println("thread "+thread.currentthread().getid()+" over");

} public static void main(string args)

}}

輸出:

000

0thread 11 over

thread 1 over

同理

package com.taobao.threadlearning.******;

public class sharingobjects2

public void setvalue(int value) }

}

這段**也是執行緒不安全的,當a執行緒已經呼叫過set方法,在a執行緒本地儲存的變數寫回到公共空間前b執行緒依然可能通過get方法獲得已經過期的資料。

如何解決?

兩種方式

a   同步

b   volatile關鍵字

當乙個域宣告為volatile型別後,它確保對乙個變數的更新以可預見的方式告知其他的執行緒。volatile變數不會快取在暫存器或者快取在在對其他處理器隱藏的地方。所以,讀取乙個volitile型別的時,總會返回由某一線程所寫入的最新值。

當然volatile只能保證可見性,而加鎖可以保證可見性和原子性。

以下**

volatile int i;

public int incandget()

任然不能保證在多執行緒下正常工作,原因原子性

Java多執行緒可見性(一)

一 記憶體可見性 執行緒對共享變數的修改,可以及時的被其他執行緒看到。那何為共享變數呢?就是在多個執行緒的工作記憶體中存在 如下圖所示 所謂的共享變數就是主記憶體中名為s的變數,程式中所有的變數都會儲存在主記憶體中 其他執行緒也會有自己的工作記憶體,此工作記憶體的作用是為執行緒與主記憶體之間建立橋梁...

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

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

執行緒同步之可見性試驗

執行緒同步的作用包含2個方面 1.原子性 這裡的原子性跟資料庫事務的原子性相似,不論多個可變狀態變數還是單個可變狀態變數,要保證併發操作的正確性,必須保證每個執行緒拿到的資料都是正確的,不存在過期資料或者部分過期資料。最常見的違反原子性錯誤的情形是 select update check use r...