單例模式是指對乙個物件進行一次例項化,然後全域性都可以呼叫該例項化物件來完成專案的開發。
在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個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...