java基本型別是原子性的,多執行緒時是否還需要宣告volatile來保證可見性?

時間 2021-10-15 17:44:27

1樓:哲學家888

這種問題,你肯定會得到互相矛盾的答案,不知道該信哪個。最正確的答案在JVM specification 裡,自己去看。

當然這題還算簡單,所以你也可以信一下我。Volatile 確實主要是保證可見性,但它也確實額外有原子性的保證。Long 和 double 的讀寫在JVM specification 裡不保證是 atomic的,但加了volatile 就可以保證。

但實際實現中,如書中所說,基本都是原子的。書的意思不是說不要用volatile, 是說不必僅僅為原子性去用。當然,只要原子性而不需要考慮可見性的應用場景不多。

簡單說,書是對的。

2樓:李啟良

基本資料型別不是原子性的,你對原子性的概念可能理解得不對。

多執行緒併發對某個變數讀寫的場景,必須要使用volatile修飾該變數,不然執行時就是一直在暫存器中讀取該變數了。而使用volatile修飾該變數後,執行時就會始終從主存中讀取該變數,這樣才能保證能感知到該變數被其它執行緒非同步修改。

java的基本型別的成員變數在棧還是堆?

Intopass 區域性變數在stack中,包括基本型別變數和引用。成員變數在heap中,包括基本型別變數和引用。引用中儲存的是指向head的位址。說到引用型別時,要把引用自身和heap中的物件區分開來。你完全可以宣告乙個引用賦值為null,那麼就不指向heap中的物件了。 愛諳夜令 先說結論,放在...

LLVM 的基本型別是如何設計的

陸明非 一開始是有sign unsigned的,後來去了,資訊放在opcode上,opcode有signed和unsigned,這樣基本上和硬體一致了. saturnman 我前一段時間略翻了一遍llvm的ref,型別這一塊屬於抽象和具體硬體平衡的一種結果。基本上參考了過去幾十年主流處理器架構支援的...

javascript中,基本型別的變數的賦值語句會在記憶體中產生兩個副本嗎?

唐靜鑫 JS的基本型別是存在棧中的,而且每個基本型別都是單獨儲存在記憶體的不同位址中。所以在日常的開發中,你會發現基本型別的賦值並不會相互影響。 賀師俊 只要保證符合 ECMAScript 規範規定的語義,記憶體裡是幾份是無所謂的。而且就算是兩份,通常你也看不出來。在現代JS引擎中,對字串有各種優化...