每個執行緒都有自己的空間去暫存資料
當有乙份資料在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...