在對專案進行PMD靜態程式碼偵測時,遇到了這樣一個問題
##Partially created objects can be returned by the Double Checked Locking pattern when used in Java. An optimizing JRE may assign a reference to the baz variable before it calls the constructor of the object the reference points to.Note: With Java 5, you can make Double checked locking work, if if declare the variable to be volatile.可能在使用雙重檢驗鎖定模式時,會傳回一個未完全初始化的物件。有些人可能會懷疑部分初始化物件的概念,請繼續往下分析什麼是雙重檢驗鎖定模式
<code>public static Singleton getSingleton() {<br> if (instance == null) { <br> synchronized (Singleton.class) {<br> if (instance == null) { <br> instance = new Singleton();<br> }<br> }<br> }<br> return instance ;<br>}</code>
建立一個物件可以分為三部:
<code>1.分配对象的内存空间<br>2.初始化对象<br>3.设置instance指向刚分配的内存地址<br>当instance指向分配地址时,instance是不为null的</code>
線程A第一次建立物件Singleton,物件建立順序為1-3-2;
當給instance分配完記憶體後,這時來了一個執行緒B呼叫了getSingleton()方法
這時候進行instance == null的判斷,發現instance並不為null。
但注意這時候instance並沒有初始化對象,線程B則會將這個未初始化完成的對象返回。那B線程使用instance時就可能會出現問題,這就是雙重檢查鎖定問題所在。
<code>public class Singleton{<br> private volatile static Singleton instance;<br> public static Singleton getSingleton() {<br> if (instance == null) { <br> synchronized (Singleton.class) {<br> if (instance == null) { <br> instance = new Singleton();<br> }<br> }<br> }<br> return instance ;<br> }<br>}</code>
<code>public class Singleton { <br> private static class SingletonHolder { <br> private static final Singleton INSTANCE = new Singleton(); <br> } <br> private Singleton (){} <br> public static final Singleton getInstance() { <br> return SingletonHolder.INSTANCE; <br> } <br>}</code>
以上是java雙重檢驗鎖定模式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!