簡體   English   中英

每次讀取交叉線程變量都應該將其放在volatile或Atomic上還是由同步包裝嗎?

[英]Should every read for cross thread variable to be on volatile or Atomic or being wrapped by synchronization?

我可以說如果一個變量可以被其他線程修改,那么如果沒有內存屏障,我將永遠無法安全地讀取它?

是的,差不多。 如果將(w)寫入線程T1中的變量並從線程T2中讀取(r)該變量,則需要確保(w)和(r)之間發生事前關聯,以確保()的結果w)對(r)可見。 Java內存模型定義了( JLS 17.4.5 )在關系發生之前發生的情況:

  • 監視器上的解鎖發生在該監視器上的每個后續鎖定之前。
  • 在隨后每次對該字段進行讀取之前,都會寫入一個易失字段(第8.3.1.4節)。
  • 在啟動線程中的任何操作之前,都會在線程上調用start()。
  • 線程中的所有操作都會發生-在任何其他線程成功從該線程上的join()返回之前。
  • 任何對象的默認初始化都發生在程序的其他任何動作(默認寫操作除外)之前。

暫無
暫無

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

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