2 回答

TA貢獻1835條經驗 獲得超7個贊
僅當您的計算機包含多個 CPU 時才應使用易失性變量嗎?
除非您正在為嵌入式系統編寫代碼,否則針對特定硬件平臺優化您的代碼可能是在浪費您的時間。從長遠來看,這甚至可能是一個代價高昂的錯誤。
如果您正在編寫 Java 代碼,那么您很可能正在編寫服務、Web 應用程序、移動應用程序或桌面應用程序。如果您正在編寫任何這些內容,那么您的目標應該是通用 Java 平臺,或者 Java 平臺和某些特定的 SDK 或框架。幫自己一個忙,不要擔心任何電腦或手機的品牌和型號。
如果一個字段被聲明為 volatile,... Java ... 確保所有線程看到變量的一致值
每當你使用“一致”這個詞時,你應該問自己,“與什么一致? ”
如果將單個變量標記為volatile
,那么所有線程都會看到該變量的值與自身一致。也就是說,如果您有一個double d=0.0;
,并且線程 A 設置了d=1.0;
,并且線程 Bsystem.out.println(d);
大約在同一時間調用,則線程 B 保證打印0.0
或1.0
。它永遠不會打印任何其他值。
也許更重要的是,如果一個 volatile 變量被更新多次,那么所有線程將就更新發生的一致順序達成一致。
但是,如果您希望多個變量彼此一致,那么您應該使用synchronized
塊或java.util.concurrent.locks.ReentrantLock
對象來保護該組變量,而忘記了volatile.
每個線程都可以將變量從主內存復制到 CPU 緩存中...
Java 中沒有“緩存”。Java 有它的內存模型。CPU 緩存是內存模型背后的隱藏原因。如果您正在為某個特定的計算機平臺實現 JVM,那么希望 Java 內存模型能夠讓您自由地利用平臺的緩存系統為您帶來好處。
如果您正在為 Java 平臺編寫代碼,那么您應該首先擔心 Java 內存模型,以及您的程序在面對它時是否會正確運行。學習高速緩存系統是一項課外活動,它可以幫助您更好地理解 Java 為何如此。

TA貢獻1847條經驗 獲得超11個贊
可變變量保證發生在關系之前。如果只有一個線程正在寫入而所有其他線程正在讀取一個變量,那么在這種情況下 volatile 變量可確保線程安全。在其他情況下,您必須根據需要使用其他同步機制。
僅當您的計算機包含多個 CPU 時才應使用易失性變量嗎?但是,如果我在同一個 obj 和一個 cpu 上有多個線程,它將如何表現?
操作系統調度程序為每個線程分配 CPU。每個內核可以處理一個或多個線程取決于硬件能力??勺冏兞渴钦Z言內部的抽象,它與硬件功能沒有任何直接關系。
添加回答
舉報