[Android Pro] static 和 Volatile 的區別


reference to : http://blog.sina.com.cn/s/blog_4e1e357d0101i486.html

static也是各個業務方可以去全局修改;

volatile是處理多線程鎖的替代方案,對應有時需要實時的修改共享資源的變量,被volatile修復的變量的值可以立刻被業務方取得最新的值。
 
不過,猛地感覺,nnd,這不是一樣么,static是靜態的,所以理論上也可以在不同線程去訪問,能訪問也就是能修改,所以這里老穆在網上搜了搜 相關的資料,把這個知識點在加強下:
 

變量放在主存區上,使用該變量的每個線程,都將從主存區拷貝一份到自己的工作區上進行操作。

volatile, 聲明這個字段易變(可能被多個線程使用),Java內存模型負責各個線程的工作區與主存區的該字段的值保持同步,即一致性。

static, 聲明這個字段是靜態的(可能被多個實例共享),在主存區上該類的所有實例的該字段為同一個變量,即唯一性。

volatile, 聲明變量值的一致性;static,聲明變量的唯一性。

此外,volatile同步機制不同於synchronized, 前者是內存同步,后者不僅包含內存同步(一致性),且保證線程互斥(互斥性)。
static 只是聲明變量在主存上的唯一性,不能保證工作區與主存區變量值的一致性;除非變量的值是不可變的,即再加上final的修飾符,否則static聲明的變量,不是線程安全的。

下面摘自Java語言規范(Java Language Specification)的官方解釋:

1) If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created. 

2) A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable。

 


免責聲明!

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



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