Java正確實現(xiàn)一個單例設計模式的示例
設計模式中的單例,是最常用,也算是比較簡單的一個了。我們都知道,要想保證只有一個實例,通常采用加鎖和雙重檢查的方式來實現(xiàn)單例,代碼如下。
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,私有構造函數(shù),即不允許直接調用構造函數(shù)new一個對象。2,靜態(tài)實例。3,靜態(tài)獲取示例的方法。首先判斷instance是否為null,然后加鎖,然后再判斷instance是否為null,之后進行初始化。最后返回示例。
做到這些就足夠了嗎?并不是。
我們都知道,jvm的內(nèi)存模型,jvm中的線程有自己的工作內(nèi)存,jvm有主內(nèi)存,工作內(nèi)存是主內(nèi)存的拷貝,工作內(nèi)存和主內(nèi)存直接并不是實時一致的。一個線程創(chuàng)建了單例對象后,別的線程并不一定可以立刻感知到。所以,以上代碼中,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; } }
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接
相關文章
基于Springboot實現(xiàn)定時發(fā)送郵件功能
這篇文章主要為大家詳細介紹了基于Springboot實現(xiàn)定時發(fā)送郵件功能的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-03-03SpringMVC訪問controller報錯404的解決辦法(總結超詳細)
純注解配置SpringMVC程序,使用tomcat8.5.95版本啟動,能啟動成功并且訪問index.jsp頁面,但是訪問/save時出現(xiàn)404無法訪問,本文給大家介紹了SpringMVC訪問controller報錯404的解決辦法,文章總結的非常詳細,需要的朋友可以參考下2024-05-05