有些物件我們只需要乙個如執行緒池、快取datasource、硬體裝置等。如果有多個例項會造成相互衝突、結果不一致的問題,畢竟你有我也有,但是你有的和我有的不一定真的一模一樣,是同乙個。使用單例模式可以確保乙個類最多只有乙個例項,並提供乙個全域性的訪問點。
public class test
// private abc()
// abc n1 = new abc();
}public class cdb
}public static void main(string args)
}
那麼有什麼方法可以使得每次new出來的物件都是同乙個呢,看看下面單例模式類圖,就可以找到一些思路了!
singleton(單例)
static uniqueinstance(靜態的唯一物件申明)
private singleton() (私有的例項化方法)
static getinstance() (全域性訪問點)
了解了上面的內容,我們來寫乙個簡單的單例模式**,**如下:
public class singleton
public static singleton getinstance()
return uniqeinstance;
}}
靜態變數由於不屬於任何例項物件,是屬於類的,所以在記憶體中只會有乙份,在類的載入過程中,jvm為靜態變數分配一次記憶體空間。
這個場景我們想象一下:乙個食品工廠,工廠只有乙個,然後工廠裡也只有乙個鍋,製作完一批食品才能製作下一批,這個時候我們的食品工廠物件就是單例的了,下面就是模擬實現的**,**的單例實現和上面的簡單實現不同,做了優化處理,稍後會解釋為什麼要優化
public class chocolatefactory
public static chocolatefactory getinstance() }}
return uniqueinstance;
}// 第一步裝填
public void fill()
}// 第三步倒出
public void drain()
}// 第二步加熱
public void boil()
}}
在多執行緒的情況下,會有時間片的概念,cpu競爭,這剛好就是單例模式可能會發生問題的時候,會發生什麼樣的問題呢?以食品加工廠**為例
public synchronized static chocolatefactory getinstance()
return uniqueinstance;
}
在多執行緒情況下會例項化出兩個物件
同步(synchronized)getinstance方法
執行緒1執行到if (uniqueinstance == null)
,被執行緒2搶走了執行權,此時執行緒1還沒有new物件;執行緒2同樣來到if (uniqueinstance == null)
,發現沒有物件例項,也打算例項化物件;最後執行緒1執行緒2都會執行uniqueinstance = new chocolatefactory();
此時可以在getinstance()方法前加上synchronized修飾符同步方法,但是在多執行緒呼叫比較頻繁的時候,這種方式比較耗費效能。
「急切」建立例項
public class chocolatefactory
return uniqueinstance;
}}
public static chocolatefactory uniqueinstance = new chocolatefactory();
在應用啟動的時候就載入初始化一次例項物件,這個時候多執行緒呼叫永遠也只會有乙個例項,因為if (uniqueinstance == null)
的結果一直是false;但如果這對單例物件在應用中沒有地方用到,使用這種方式則耗費掉了一些記憶體空間
雙重檢查加鎖(最佳)
public class chocolatefactory }}
return uniqueinstance;
}}
首先public volatile static chocolatefactory uniqueinstance = null;
沒有在應用啟動的時候就初始化物件,節省了記憶體;其次synchronized修飾的**塊是再if (uniqueinstance == null) {}
判斷裡面的,只有符合條件才會進入同步方法,減少了效能消耗。 單例模式簡單介紹
單例模式 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。特點 1.建構函式不對外開放,一般為private 2.通過乙個靜態方法或者列舉返回單例類物件 3.確保單例類的物件有且只有乙個,尤其是在多執行緒環境下。4.確保單例類物件在反序列化時不會重新構建物件。2.1 餓漢式 在宣告...
Python 設計模式介紹 單例模式
1 單例是只有乙個例項 2 通過靜態欄位 靜態字段偽造出乙個單例效果 3 什麼時候用 當所有例項中封裝的資料相同時,建立單例模式 eg 連線池 用單例模式建立連線池 class cp instance none def init self self.ip 1.1.1.1 self.port 3306...
設計模式之單例模式介紹
定義 單例模式保證在整個軟體系統記憶體中只存在乙個類的例項,並且該類只有乙個方法可以獲取例項。屬於建立型設計模式。注意 必須將該類的構造方法私有化。餓漢式 靜態常量 使用靜態常量的餓漢式單例模式demo public class eagersingletondemo1 public static e...