2010-08-19 52 views
1

好吧,我只是讀了這個問題Do you ever use the volatile keyword in Java?,我得到了一個volatile變量來停止循環。我也見過這個參考,http://www.javamex.com/tutorials/synchronization_volatile.shtml。現在文章說volatile變量是非阻塞的。並且它表示它不能用於讀取更新寫入序列中的併發。這是有道理的,因爲它們是非阻塞的。Java對於併發性而言是易失性的

由於易失性變量永遠不會被緩存,因此簡單地使用同步來停止循環(從前面的鏈接)會更快嗎?

編輯:使用一個同步的溶液

public class A{ 
    private boolean test; 

    public A(){ 
    test = true; 
    } 

    public synchronized void stop(){ 
    test = false; 
    } 

    public synchronized boolean isTrue(){ 
    return test; 
    } 
} 

public class B extends Thread { 
    private A a; 

    public B(A refA){ 
    a = refA; 
    } 

    public void run(){ 
    //Does stuff here 
    try{ 
     sleep(1000); 
    } 
    catch(Exception e){} 
    a.stop(); 
    } 

    public static void main(String [] args){ 
    A TestA = new A(); 
    B TestB = new B(TestA); 
    TestB.start(); 
    while(TestA.isTrue()){ 
     //stay in loop 
     System.out.println("still in loop"); 
    } 
    System.out.println("Done with loop"); 
    } 
} 
+1

你在說什麼循環?請在這個問題中包含一個你建議使用'synchronized'的例子。 – erickson 2010-08-19 18:10:27

+0

轉到我發佈的第一個鏈接,尋找最高評分的答案。 – Albinoswordfish 2010-08-19 18:24:20

+1

你期待着很多讀者。下一次,只是在問題中包含示例... – 2010-08-19 18:34:44

回答

6

否,在讀volatile變量大於比在​​塊讀取非volatile可變速度更快。

A​​塊清除條目上的緩存值,與讀取變量volatile相同。 但是,當同步塊退出時,它也將任何緩存的寫入刷新到主存儲器,讀取volatile變量時不需要。

+0

Ahh好吧,現在有道理,謝謝 – Albinoswordfish 2010-08-19 18:25:17

1

在你的問題中存在一些錯誤的數字:只要你使用Atomic*FieldUpdater和一個cas循環,你可以用volatile做一個可靠的讀取更新寫入。揮發物可以被「緩存」,它們只需要服從相關的發生之前的指定的語義。

同步通常涉及獲得一個相對昂貴的鎖(雖然實際上可能相當便宜)。簡單的併發優化可能使用非天真的實現技術。

+0

從Java 5開始再看文章之後,有可能 – Albinoswordfish 2010-08-19 18:26:37