本章主要討論java內存的可見性問題,即在什麼狀況下另外一個線程可以讀取到當前線性寫入的變量值。java
咱們知道volatile變量一旦寫入,另外一個線程可以馬上讀取到寫入的值,在 java併發編程專題---volatile以內存可見性檢測給出了實例來講明該問題,但有的時候,不加volatile關鍵字的變量也可以被另外一個線程讀取到,如下是「java併發編程實戰」中的代碼:編程
public class NoVisibility {
private static boolean ready;
private static int number;併發
private static class ReaderThread extends Thread {
public void run() {
while (!ready) {
Thread.yield();
}
System.out.println(number);
}
}app
public static void main(String[] args) {.net
new ReaderThread().start();
number = 42;
ready = true;
}
}線程
在個人電腦上是可以讀取到最新值的。這就說明在沒有必定條件的干預下,對於共享的變量什麼時候寫入到主內存中,什麼時候從內存中讀取是不可預測的!從書中能夠知道volatile、final、原子變量、鎖機制對於內存可見性都有影響,但內存可見性也只是java內存模型中的一部份內容而已,並且後面的重排序和happens before貌似挺複雜,因此邊學邊記吧。blog