【java基礎】單例設計模式:保證一個類在記憶體中的物件唯一性
阿新 • • 發佈:2019-01-05
摘要:單例設計模式解決的問題就是可以保證一個類在記憶體中的物件唯一性,必須對於多個程式使用同一個配置資訊物件時,就需要保證物件的唯一性。
單例設計模式有兩個表現形式:餓漢式和懶漢式。餓漢式開發時常用,懶漢式面試時常用!!
下面是程式碼舉例:
public class SingletonPattern { public static void main(String[] args) { Test1 t1=Test1.getInstance(); Test1 t2=Test1.getInstance(); t1.setNum(10); t2.setNum(25); System.out.println(t1.getNum()); System.out.println(t2.getNum()); } } //單例模式表現形式一[餓漢式]:類一載入物件就已經存在了。開發時常用!! class Test1{ private int num; private static Test1 t=new Test1(); private Test1(){} public static Test1 getInstance(){ return t; } public void setNum(int num){ this.num=num; } public int getNum(){ return num; } } //單例模式表現形式二[懶漢式]:也叫延遲載入形式,類一載入進來,沒有物件 //只有呼叫getInstance()時才會建立物件。面試時常用!! //這種模式在多執行緒技術訪問下有可能保證不了物件唯一性,除非用程式碼規避,但是會降低程式碼效能,所以實際開發用餓漢式多。 class Test2{ private int num; private static Test2 t=null; private Test2(){} public static Test2 getInstance(){ if(t==null) t=new Test2(); return t; } public void setNum(int num){ this.num=num; } public int getNum(){ return num; } }
懶漢式多執行緒安全問題的解決方案:
//懶漢式 加入同步為了解決多執行緒安全問題。 加入雙重判斷是為了解決效率問題。 class Single { private static Single s = null; private Single(){} public static Single getInstance() { if(s==null) { synchronized(Single.class) { if(s==null) // -->0 -->1 s = new Single(); } } return s; } }
上面程式碼中t1和t2其實都是Test中的t物件,地址都一樣,因此最後結果都是25。