簡體   English   中英

Android ART 和 HotSpot 在非易失性變量可見性方面的行為是否不同?

[英]Do Android ART and HotSpot behave differently in non-volatile variable visibility?

我在 HotSpot 和 Android ART 上測試了以下代碼,但結果不同。

在 HotSpot 上, MyThread永遠不會得到更新的isRunning ,它總是得到isRunning = true ......但是當我在 ART 上測試它時, MyThread可以得到更新的isRunning並正常退出循環......

據我所知,java 發生在規則之前,非易失性在多線程中不可見,就像下面代碼在 Hotspot 上的行為一樣。

它是否取決於VM實現? 或者也許 Android ART 有自己的優化?

class MyThread extends Thread {
    public boolean isRunning = true;

    @Override
    public void run() {
        System.out.println("MyThread running");
        while (true) {
            if (isRunning == false) break;
        }
        System.out.println("MyThread exit");
    }
}

public class RunThread{
    public static void main(String[] args) {
        new RunThread().runMain();
    }

    public void runMain() {
        MyThread thread = new MyThread();
        try {
            thread.start();
            Thread.sleep(500);
            thread.isRunning = false;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

非易失性在多線程中不可見,就像下面代碼在 Hotspot 上的行為一樣。

不太對。 非易失性寫入,沒有任何額外的同步或其他發生前的關系,不能保證對另一個線程中相同變量的讀取可見。 不過,它是允許可見的。 盡管沒有發生之前的關系,但我絕對看到 HotSpot 使跨線程的寫入可見。 根據我的經驗,我懷疑如果您在代碼中刪除Thread.sleep調用,HotSpot 也會使對isRunning的寫入對線程可見,盡管在寫入和讀取之間沒有任何發生前的關系.

你肯定是對的,它是特定於 VM 的,它甚至可能/可能是特定於處理器架構的,因為不同的架構可能會為“免費”提供不同數量的同步,或者有不同數量的緩存會影響是否讀取 memory 地址從核心緩存或從主 memory 獲取。

總之,你不應該依賴這種行為在任何特定的虛擬機上以任何特定的方式工作——它可能會在沒有警告的情況下發生變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM