設計模式學習(Java)——單例模式

其實我們在編程過程中往往都用到了一些設計模式,只是不知道他們還有具體的名稱定義
翻閱了《設計模式之禪》後,覺得自己有必要系統地瞭解和學習一下程序設計的原則和一些常用的設計模式。
爲了加深自己的理解,在此記錄一下。


單例模式

  顧名思義,就是指某一個類在程序中只會有一個實例。

  爲什麼使用單例模式?

   (1)節省內存

        內存中始終只存在一個實例,避免了重複創建和丟棄實例造成的內存浪費

   (2)節省資源

       在進行IO操作的時候,通過創建一個入口防止資源的佔用

   (3)統一信息

       也可以直接使用Static聲明變量,單例或者Static可以確保某些變量全局統一

   如何實現單例模式

(1)餓漢模式

public class SingleExample{
//一個固定的不可更改的實例
private final static  SingleExample instance=new SingleExample();
//將構造函數用Private限制,使得外部無法創建實例
private SingleExample(){
   System.out.println("this is creating SingleExample");
}
//獲取固定實例的方法(此方法返回的永遠是同一個實例)
public static SingleExample getInstance(){ 
   return instance;
}
public static void say(){  
   System.out.println("this is SingleExample is Saying ");
}
}

(2)懶漢模式

public class SingleExample{
//本類的一個實例變量
private static  SingleExample instance=null;
//將構造函數設置成Private
private SingleExample(){
  System.out.println("this is creating SingleExample" );
}
//獲取實例,如果已經存在一個實例了,直接將其返回,沒有則新建一個實例
public static   SingleExample getInstance(){
	if(instance==null){
		instance=new SingleExample();
	}
	return instance;
}

public static void say(){
  System.out.println("this is SingleExample is Saying ");
}

}


其中例子裏的懶漢模式其實是線程不安全的,就是在高併發的多線程場景中可能會產生多個實例。

爲什麼?

  在多個線程中同時執行getInstance方法中判斷語句時,當線程1判斷得出instance=null並開始創建實例,同時在實例穿件成功前,線程2也進行了判斷,而此時instance=null,線程2也會創建一個實例。

解決

  給getInstance()方法添加同步鎖(synchronized


發佈了46 篇原創文章 · 獲贊 123 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章