為什麼要使用volatile修飾呢?

2022-07-10 12:21:10 字數 457 閱讀 6939

1.禁止指令重排序

建立物件要經過如下幾個步驟

a. 分配記憶體空間

b. 呼叫構造器,初始化例項

c. 返回位址給引用

但是jvm具有指令重排的特性,執行的順序有可能變成 a-c-b,指令重排在單執行緒下不會出現問題,但是在多執行緒下會導致乙個執行緒獲得還沒有初始化的例項。例如:執行緒t1執行了a,b,此時執行緒t2呼叫getinstance()方法發現instance不為null,因此返回instance,但此時instance還未被初始化。

2.保證可見性

由於可見性問題,執行緒t1在自己的工作執行緒內建立了例項,但此時還未同步到主記憶體中,此時執行緒t2判斷instance還是null,那麼執行緒t2又將在自己的工作執行緒建立乙個例項,這樣就建立了多個例項

如果加上了volatile修飾instance之後,保證了可見性,一旦執行緒t1返回了例項,執行緒t2可以立即發現instance不為null

為什麼要使用blog

有哥們問我,你為什麼使用blog?我總結了一下,覺得有如下幾個原因。1對自己的督促 有了blog,就會經常記得寫點東西 就會經常翻翻網上的新文章,了解一下新技術,不至於迷失在忙碌的生活中 如果把自己的所感所想所學寫出了,自己對自己也會有個概念,不至於迷迷糊糊 還有,畢竟是掛在網上的文字,心中難免擔心...

為什麼要使用XML

xml 代表擴充套件標記語言 extensible markup language 是由 world wide web consortium w 3c 的 xml工作組定義的。這個工作組是這樣描述該語言的 擴充套件標記語言 xml 是 sgml 的子集,其目標是允許普通的 sgml 在web 上以目...

為什麼要使用Nginx?

有人說這些基準測試是不準確的,因為在這樣那樣的環境下,做的比較不一致。我傾向同意基準測試只是告訴了我們其中一部分情況,你能做的是消除偏見 有人見過所有人都同意乙個基準測試是公平的嗎?我是沒見過。我們投資的一些公司把web平台切換到nginx後,可以顯著的解決擴充套件問題。nginx明顯有效的實現了今...