1. 程式人生 > >Java中的static和volatile變數的區別?

Java中的static和volatile變數的區別?

在java中宣告一個靜態變數,意味著只有一個副本,無論建立了多少個類的物件,即使沒有建立物件,變數也可以訪問,但是執行緒可能具有本地快取的值。
當變數volatile而不是靜態時,每個object都有一個變數,所以,表面看來,與正常變數沒有區別,但是與靜態完全不同。然而,即使使用object欄位,執行緒也可能在本地快取變數值。
這意味著如果兩個執行緒同時更新同一個物件的變數,並且該變數未被宣告為volatile,則可能存在一個執行緒在快取中具有舊值的情況。
即使你通過多個執行緒訪問靜態值,每個執行緒都可以具有本地快取副本,為了避免這種情況,可以將變數申明為靜態volatile,這將強制執行緒每次讀取全域性值,但是volatile並不能代替正確的同步!

這裡寫圖片描述