單例模式與執行緒安全

2022-08-31 04:18:11 字數 2232 閱讀 4873

概念:

單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個printer spooler,以避免兩個列印作業同時輸出到印表機中。單例模式主要有餓漢模式和懶漢模式(延遲載入),特點如下:

1、單例類只能有乙個例項。

2、單例類必須自己建立自己的唯一例項。

3、單例類必須給所有其他物件提供這一例項。

餓漢模式:(在使用類的時候就將類載入,屬於執行緒安全),**如下

public

class

singleton

public

static

singleton getinstance()

public

static

void

main(string args) }}

public class myrunnable implements runnable 

}

此時列印出來的結果如下(可見取得是同一例項): 

懶漢模式:(延遲載入,在獲取例項的時候,才去建立)

public

class

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

class

singleton

//獲取例項時才建立

public

static

singleton getinstance()

} catch

(interruptedexception e)

}return

singleton;

}

public

static

void

main(string args) }}

但此時還是出現執行緒不安全的因素,這是因為有可能兩個或三個執行緒同一時間執行到了synchronized(singleton.class),第乙個獲取鎖的執行緒

new了乙個例項,等第乙個執行緒釋放鎖的時候,第二個執行緒繼續獲取鎖並從新

new乙個例項。

想要解決執行緒安全,只需要採用dcl雙鎖機制即可,**如下:

public

class

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的乙個判斷問題。單例大約有兩種實現方法 懶漢與餓漢。懶漢 故...