国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java單例模式學習示例

2019-11-26 15:47:33
字體:
來源:轉載
供稿:網友

單例模式有一下特點:
1、單例類只能有一個實例。
2、單例類必須自己自己創建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。
單例模式確保某個類只有一個實例,而且自行實例化并向整個系統提供這個實例。在計算機系統中,線程池、緩存、日志對象、對話框、打印機、顯卡的驅動程序對象常被設計成單例。這些應用都或多或少具有資源管理器的功能。每臺計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業同時輸出到打印機中。每臺計算機可以有若干通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。

首先看一個經典的單例實現。

復制代碼 代碼如下:

public class Singleton {

private static Singleton uniqueInstance = null;

private Singleton() {

   // Exists only to defeat instantiation.

}

public static Singleton getInstance() {   if (uniqueInstance == null) {

       uniqueInstance = new Singleton();

   }

   return uniqueInstance;

}

// Other methods...
}

Singleton通過將構造方法限定為private避免了類在外部被實例化,在同一個虛擬機范圍內,Singleton的唯一實例只能通過getInstance()方法訪問。(事實上,通過Java反射機制是能夠實例化構造方法為private的類的,那基本上會使所有的Java單例實現失效。此問題在此處不做討論,姑且掩耳盜鈴地認為反射機制不存在。)

但是以上實現沒有考慮線程安全問題。所謂線程安全是指:如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。或者說:一個類或者程序所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導致該接口的執行結果存在二義性,也就是說我們不用考慮同步的問題。顯然以上實現并不滿足線程安全的要求,在并發環境下很可能出現多個Singleton實例。

復制代碼 代碼如下:

//餓漢式單例類.在類初始化時,已經自行實例化
public class Singleton1 {
//私有的默認構造子
private Singleton1() {}
//已經自行實例化
private static final Singleton1 single = new Singleton1();
//靜態工廠方法
public static Singleton1 getInstance() {
return single;
}
}

//懶漢式單例類.在第一次調用的時候實例化
public class Singleton2 {
//私有的默認構造子
private Singleton2() {}
//注意,這里沒有final
private static Singleton2 single=null;
//靜態工廠方法
public synchronized static Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 格尔木市| 金湖县| 广平县| 龙川县| 永安市| 阜阳市| 黄龙县| 绥中县| 西乌珠穆沁旗| 柏乡县| 乌兰浩特市| 佳木斯市| 屏山县| 阳曲县| 曲阳县| 汶川县| 五常市| 抚宁县| 云南省| 江川县| 银川市| 浮梁县| 米泉市| 罗源县| 仲巴县| 岳阳县| 兴安盟| 新宁县| 淅川县| 大同市| 沙河市| 温宿县| 鹿泉市| 齐齐哈尔市| 桐乡市| 朝阳市| 景德镇市| 浪卡子县| 平泉县| 乌审旗| 涟水县|