[英]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.