概念:
單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個printer spooler,以避免兩個列印作業同時輸出到印表機中。單例模式主要有餓漢模式和懶漢模式(延遲載入),特點如下:
1、單例類只能有乙個例項。
2、單例類必須自己建立自己的唯一例項。
3、單例類必須給所有其他物件提供這一例項。
餓漢模式:(在使用類的時候就將類載入,屬於執行緒安全),**如下
publicclass
singleton
public
static
singleton getinstance()
public
static
void
main(string args) }}
public class myrunnable implements runnable此時列印出來的結果如下(可見取得是同一例項):}
懶漢模式:(延遲載入,在獲取例項的時候,才去建立)
publicclass
singleton
//獲取例項時才建立
public
static
singleton getinstance()
catch
(interruptedexception e)
}return
singleton;
}
public
static
void
main(string args) }}
public此時列印出來的結果如下:(可見其實取得不是同一例項):class myrunnable implements
runnable
}
對於執行緒安全問題,一般處理方法就是為該方法加入關鍵字
synchronized
( 即:
synchronized public static singleton getinstance(){}
),此時確實能解決執行緒安全問題,但是,該方法效能不高,於是我這裡才有同步**塊的方式,**如下:
public但此時還是出現執行緒不安全的因素,這是因為有可能兩個或三個執行緒同一時間執行到了synchronized(singleton.class),第乙個獲取鎖的執行緒class
singleton
//獲取例項時才建立
public
static
singleton getinstance()
} catch
(interruptedexception e)
}return
singleton;
}
public
static
void
main(string args) }}
new了乙個例項,等第乙個執行緒釋放鎖的時候,第二個執行緒繼續獲取鎖並從新
new乙個例項。
想要解決執行緒安全,只需要採用dcl雙鎖機制即可,**如下:
publicclass
singleton
//獲取例項時才建立
public
static
singleton getinstance()
}
} catch
(interruptedexception e)
}return
singleton;
}
public
static
void
main(string args) }}
單例模式與執行緒安全
請看如下的單例類 class singleton return singleton 首先判斷singleton是否為null,如果是就建立singleton物件,否則直接返回singleton。但是判斷和建立並非原子操作,假設執行緒1正在執行null singleton,判斷為true,準備執行下一...
單例模式與執行緒安全
在類載入的時候,就已經進行例項化,無論之後用不用到。如果該模擬較佔記憶體,之後又沒用到,就白白浪費了資源。public class hungersingleton private hungersingleton public static void main string args start 在需...
單例模式與執行緒安全單例模式(懶漢 餓漢)
直接就可以在靜態區初始化instance,然後通過getinstance返回,這種就被稱為餓漢式單例類。也有些寫法是在getinstance中new instance然後返回,這種就被稱為懶漢式單例類,但這涉及到第一次getinstance的乙個判斷問題。單例大約有兩種實現方法 懶漢與餓漢。懶漢 故...