對於final域,編譯器和處理器遵循兩個重排序規則:
在建構函式內對乙個final域的寫入,與隨後把這個被構造物件的引用賦值給另乙個引用變數,這兩個操作之間不能重排序。
初次讀乙個包含final域的物件的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序。
我測試了半天沒測出來。。。
public class test
static void write()
static void read() catch (interruptedexception e)
test t = test;
system.out.println(t.i);
system.out.println(t.j);
} public static void main(string args)
});t.start();
test.read();
}}
大概如上**,注釋是在測試的時候打的(但我沒有測出來)。
解釋一下上述內容,第一條就是對於test構造方法裡邊對j的初始化必須在read方法之前。
實現細節:
在對final域寫之後,建構函式return之前,會加乙個strorestrore屏障,這個屏障會禁止把final域的寫重排序到建構函式之外。 這樣寫final域的重排序規則可以確保,在物件引用為任意執行緒可見之前,物件的final已經被正確的初始化了。
那麼第二條細節:
這條是關於讀final域的規則,在乙個執行緒總,初次讀物件引用與初次讀該物件包含的final,這兩個之間不會重排序這兩個操作。
即:在讀乙個物件的fianl域以前,先回讀取final物件的引用。
執行緒安全與可重入的關係
執行緒安全與可重入性是兩個不同性質的概念。可重入是在單執行緒作業系統背景下,重入的函式或者子程式,按照後進先出的線性序依次執行完畢。多執行緒執行的函式或子程式,各個執行緒的執行時機是由作業系統排程,不可預期的,但是該函式的每個執行執行緒都會不時的獲得cpu的時間片,不斷向前推進執行進度。可重入函式未...
執行緒安全與非執行緒安全的區別
執行緒安全 是多執行緒訪問時,採用加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。非執行緒安全 是多執行緒訪問時,不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料。所得資料...
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...