我們從以下方面更改現(xiàn)有代碼是否有任何好處:class MyClass { volatile Object myVariable; Object myMethod() { if (myVariable == null) { synchronized(this) { if (myVariable == null) { myVariable = this.getNewValue(); } } } return myVariable; }}到class MyClass { volatile Object myVariable; Object myMethod() { Object tmp = this.myVariable; if (tmp == null) { synchronized(this) { tmp = this.myVariable; if (tmp == null) { this.myVariable = tmp = this.getNewValue(); } } } return tmp; }}我不明白在使用之前在本地復制 this.myVariable 有什么意義,而且我認為使用“this”不是一個好習慣。對于每個類變量。
1 回答

慕雪6442864
TA貢獻1812條經(jīng)驗 獲得超5個贊
復制到局部變量更高效、更正確。
更高效:假設在一般情況下,myVariable
是非空的。在第一個版本中,您對 執(zhí)行兩次讀取myVariable
,一次檢查 null,一次返回值。在第二個版本中,您執(zhí)行一次讀取myVariable
和兩次讀取tmp
(局部變量訪問,這是微不足道的)。使用 volatile 的全部意義在于強大的內(nèi)存保證,而這些保證意味著兩次讀取對一次讀取的性能影響很大。
更正確:假設這myVariable
是某種需要定期刷新的“緩存”。即有一個后臺線程定期設置,myVariable
以便null
在下次讀取時重新加載。在第一個版本中,您對myVariable
. 第一次讀取可能返回非null
,然后“緩存刷新”邏輯運行并設置myVariable
為null
。第二次讀?。ǚ祷刂担┤缓蠓祷?code>null!在第二個版本中,始終tmp
是您測試的值(當然假設永遠不會返回)。null
getNewValue()
null
注意使用“這個”。是此代碼中的一種風格選擇,與正確性或性能問題無關。
這在很大程度上只是擴展了https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java中所述的內(nèi)容。
添加回答
舉報
0/150
提交
取消