Java併發程式設計 單例模式執行緒安全問題

2021-09-24 08:33:58 字數 1566 閱讀 1695

單例模式是指對乙個物件進行一次例項化,然後全域性都可以呼叫該例項化物件來完成專案的開發。

在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個printer spooler,以避免兩個列印作業同時輸出到印表機中。每台計算機可以有若干通訊埠,系統應當集中管理這些通訊埠,以避免乙個通訊埠同時被兩個請求同時呼叫。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。

###實現單例的不同方式

#####餓漢式單例 餓漢式單例是指在方法呼叫前,例項就已經建立好了。下面是實現**:

package com.thread.singleton;

/** * 單例模式-- 餓漢式

* created by fant.j.

* 2018/2/25 19:24

*/public class singleton1

private static singleton1 singleton1 = new singleton1();

public static singleton1 getinstance()}

複製**

#####懶漢式單例 懶漢式單例是指在方法呼叫獲取例項時才建立例項,因為相對餓漢式顯得「不急迫」,所以被叫做「懶漢模式」。下面是實現**:

package com.thread.singleton;

/** * 單例模式 -- 懶漢式

* created by fant.j.

* 2018/2/25 19:30

*/public class singleton2

private static singleton2 instance;

public synchronized static singleton2 getinstance

()

return instance;

}}複製**

在這段**中,在if語句裡面,就可能跑有多個執行緒同步判斷和同步new。會產生執行緒安全問題。 ######解決方法:

給方法加上synchronized(變成單執行緒,影響效能)

給**塊加synchronized(雙重檢查加鎖) 雖然2方法解決了效能問題, 但是還會有問題 。 問題來自 jvm 的優化:指令重排序(有興趣了解) 我們可以在物件中新增volatile 關鍵字來 不讓jvm對該 物件做優化 完善後的**如下:

package com.thread.singleton;

/** * 單例模式 -- 懶漢式

* created by fant.j.

* 2018/2/25 19:30

*/public class singleton2

private static singleton2 instance;

public synchronized static singleton2 getinstance

() }}

return instance;

}}複製**

JAVA併發程式設計(四)單例模式與執行緒安全問題

單例模式與執行緒安全 一。餓漢模式 立即載入 立即載入就是使用類的時候已經將物件建立完畢。呼叫方法前,例項已經被建立了。public class myobject public static myobject getinstance 二。懶漢模式 延遲載入,執行緒不安全 延遲載入是指在呼叫方法時例項...

double check單例模式是否執行緒安全

要求 1.執行緒安全 2.效率高 double check優化了每次呼叫加鎖的開銷。static t m pinstance static t instance void void omutex.release return m pinstance new 操作符不是原子操作。new 操作符的執行過...

單例模式併發

在研究單例模式的時候,為了保證單例的懶載入是同步的,我們通常會選擇乙個duoble check的方法來保證只有第一次才new物件。1.雙重檢測同步延遲載入 如下 關於volatile的作用在這裡就是保證在new出物件的那一立馬寫入主存,同時通知其他執行緒的他們的cache是無效的,這樣instanc...