Java 中 static 和 volatile 關鍵字的區別?


  • static指的是類的靜態成員,實例間共享
  • volatile跟Java的內存模型有關,線程執行時會將變量從主內存加載到線程工作內存,建立一個副本,在某個時刻寫回。valatile指的每次都讀取主內存的值,有更新則立即寫回主內存。

理解了這兩點,逐句再來解釋你的困惑:

  1. “既然static保證了唯一性”:static保證唯一性,指的是static修飾的靜態成員變量是唯一的,多個實例共享這唯一一個成員。
  2. “那么他對多個線程來說都是可見的啊”:這里,static其實跟線程沒太大關系,應該說對多個對象實例是可見的。你說對多個線程可見,雖然沒什么毛病,因為靜態變量全局可見嘛,但是把這個理解轉到線程的上線文中是困惑的起因。
  3. “volatile保證了線程之間的可見性”:因為線程看到volatile變量會去讀取主內存最新的值,而不是自個一直在那跟內部的變量副本玩,所以保證了valatile變量在各個線程間的可見性。
  4. “那么修改的時候只要是原子操作,那么就會保證它的唯一性了吧”:此時你說的“唯一性”,指的是各個線程都能讀取到唯一的最新的主內存變量,消除了線程工作內存加載變量副本可能帶來的線程之間的“不唯一性”。這里“唯一性”的含義跟第一句說的“唯一性”是不一樣的。
  5. “這兩個在我理解上我覺得差不多。”:其實解決問題的“場景”是完全不一樣的。
造成理解困惑最大的原因在於,這兩個場景略有類似,以致混淆了:
  • 場景1:各個類的實例共享唯一一個類靜態變量
  • 場景2:各個線程共同讀取唯一的最新的主內存變量的值,只保證可見性,它不足以保證數據的同步性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM