您好,登錄后才能下訂單哦!
設計模式中的單例,是最常用,也算是比較簡單的一個了。我們都知道,要想保證只有一個實例,通常采用加鎖和雙重檢查的方式來實現單例,代碼如下。
public class SingletonTest { private SingletonTest(){ } private static SingletonTest instance; public static SingletonTest getInstance(){ if(instance == null){ synchronized (SingletonTest.class){ if(instance == null){ instance = new SingletonTest(); } } } return instance; } }
這種寫法的要點主要有如下幾個,1,私有構造函數,即不允許直接調用構造函數new一個對象。2,靜態實例。3,靜態獲取示例的方法。首先判斷instance是否為null,然后加鎖,然后再判斷instance是否為null,之后進行初始化。最后返回示例。
做到這些就足夠了嗎?并不是。
我們都知道,jvm的內存模型,jvm中的線程有自己的工作內存,jvm有主內存,工作內存是主內存的拷貝,工作內存和主內存直接并不是實時一致的。一個線程創建了單例對象后,別的線程并不一定可以立刻感知到。所以,以上代碼中,instance還需要用volatile來修飾,才能真正做到單例模式。修改后的代碼如下。
public class SingletonTest { private SingletonTest(){ } private static volatile SingletonTest instance; public static SingletonTest getInstance(){ if(instance == null){ synchronized (SingletonTest.class){ if(instance == null){ instance = new SingletonTest(); } } } return instance; } }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。