多執行緒資料改變導致可見性問題整理
阿新 • • 發佈:2019-02-18
這裡也是一個比較好玩的話題:
梳理:當一個執行緒訪問資料,是序列的,也就是第一次改變資料,第二次訪問
肯定是拿到改變後的資料。而多執行緒就沒有這麼好的命運了。當A
改變資料,B去拿的時候可能資料來源根本沒有變化,錯誤以為沒有改變。
JAVA併發程式設計實戰舉了一個例子。
當A嘗試改變一個數據,同時改變狀態為已經改變的狀態。
B檢查狀態改變做相應的處理。當簡單的多執行緒甚至是加鎖處理髮現效果並不滿意:
原因很簡單:加鎖防止別的執行緒訪問,但是自己改變了資料並不能及時的通知對方。
public class Down extends Thread{ static boolean isChanged; static int count; static DownloadEntity downloadEntity=new DownloadEntity(); public static void main(String args[]) { new ReadThread().start(); isChanged=true; count=111; } static class ReadThread extends Thread { public void run() { while(!isChanged) Thread.yield(); System.out.print(count); } } public void run() { downloadEntity.get(System.currentTimeMillis()); } public static void print() { System.out.print(downloadEntity.get(System.currentTimeMillis())); } }
很遺憾,這段程式碼執行完了
那麼是什麼導致》?待:
主要是set/get未上鎖,待論證