2013-04-20 74 views

回答

2

讓我們先從什麼是Java中的volatile變量:

在Java中

volatile關鍵字被用來作爲指標到Java編譯器和線程沒有這個變量的緩存值,讀它從主內存

那麼什麼是從內存讀取變量值的利益,考慮下面的示例代碼:

public class Singleton{ 
private static volatile Singleton _instance; //volatile variable 

public static Singleton getInstance(){ 

if(_instance == null){ 
     synchronized(Singleton.class){ 
      if(_instance == null) 
      _instance = new Singleton(); 
     } 

} 
return _instance; 

} 
先前樣品中

1)我們只是在懶惰地第一請求的時間來創建實例一次

2)我們正在創建實例來。

如果我們不讓_instance變量變爲volatile,那麼創建Singleton實例的Thread將無法與其他線程通信,該實例已經創建,直到它出來Singleton塊,所以如果線程A創建Singleton實例並且在創建丟失了CPU之後,所有其他線程將無法將_instance的值看作非null,並且他們會認爲它仍然爲空。

結論:

volatile關鍵字將更加有用。當多個線程使用相同的變量時,每個線程將擁有自己的該變量的本地緩存副本。所以,當它更新值時,它實際上在本地緩存中更新,而不是在主變量內存中更新。另一個線程使用相同的變量不知道另一個線程更改的值

+0

可以線程在同步塊內丟失CPU嗎?我不這麼認爲,即使創建後CPU丟失了,其他線程也不能進入synchronized塊中,直到線程A離開syn塊爲止,屆時_instance將刷新到主內存中,其他所有線程將會看到更新/最新值..我錯過了什麼?請幫我澄清我的疑問。提前致謝。 – Samra 2014-01-30 16:52:01

+0

@Mark請問您可以對我的上述查詢發表評論嗎? – Samra 2014-01-31 06:53:29

1

Java中的易失性關鍵字用作Java編譯器和線程的指示器,它不緩存該變量的值並始終從主內存讀取該變量。

What will happen if we remove it from a synchronized block?

+0

這也是爲了阻止編譯器重新排序與該變量相關的操作。 – 2013-04-20 11:10:25