1. 程式人生 > >多執行緒資料改變導致可見性問題整理

多執行緒資料改變導致可見性問題整理

這裡也是一個比較好玩的話題:

梳理:當一個執行緒訪問資料,是序列的,也就是第一次改變資料,第二次訪問

肯定是拿到改變後的資料。而多執行緒就沒有這麼好的命運了。當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未上鎖,待論證