單例模式 五種方式 不要被轉殖

2021-07-26 04:51:17 字數 1671 閱讀 1273

單例模式需要考慮,執行緒安全問題,效率問題,防止反射和防止被反序列化。
單例模式-防止反射和反序列化:

private single1() 

}//在反序列化的時候直接返回單例

private object readresolve() throws objectstreamexception

1、餓漢模式

private  static single1 instance = new single1();
缺點:由於在宣告的時候已經初始化,即使該類沒有使用也會占用記憶體。

2、懶漢模式

public static single2 instance;

private single2()

public synchronized single2 getinstance()

return instance;

}

優點:使用時候建立,可能節約記憶體。

缺點:每次都要鎖住方法,即使instance已經被初始化,導致效率較低。

3、double checklock dcl模式

public class single3 

public static single3 getinstance()

}return instance;

}}

優點:不會一直鎖住,效率高些,在使用的時候才會初始化,也避免了記憶體浪費。

缺點:dcl失效,由於instance = new single3();雖然是一條語句,但是卻不是原子操作。例項化物件的彙編指令大致有三件事

1、給instance分配記憶體

2、呼叫new single3()初始化函式

3、將分配的記憶體空間位址賦值給instance

在jdk1.5之前執行順序可能是1-2-3,或者1-3-2,如果是1-3-2,可能比得執行緒拿到的就是乙個記憶體位址而instance沒有呼叫初始化方法new single3(),

jdk1.5之後修復,加入關鍵字volatile,避免以上錯誤,所以確保dcl正確性,給變數加上這個屬性

public class single3 

public static single3 getinstance()

}return instance;

}}

4、靜態內部類

public class single4 

public static single4 getinstance()

private static class singleholder

}

在載入類single4的時候,不會初始化instance。呼叫getinstance()才會載入singleholder類,避免執行緒安全,沒有記憶體不必要浪費,不用鎖。推薦使用。

5、列舉單例

由於列舉本來就是例項數量已知且固定的,所以如果列舉類只有乙個例項,也就實現了單例,而且不用考慮被反射和反序列化 而被轉殖,任何情況下

都是單例的。

public enum single5 

public void init()

}

單例模式的五種方式

核心作用 保證乙個類只有乙個例項,並且提供了乙個訪問該例項的全域性訪問點。常見應用場景 單例模式的優點 常見的五種單例模式 主要其他 延遲載入 lazy load 也稱為懶載入。簡單來說,就是只有在使用的時候,才去呼叫或載入。是延遲載入。實現 懶漢式 單例模式 public class single...

單例模式的五種實現方式

1.最容易想到的方式 public class singleton public static singleton getinstance public static void main string args 優點是 簡單 缺點是 無論用沒用到instsnce,都會進行初始化。2.延遲載入 laz...

單例模式的五種實現方式

單例模式 無論在什麼時候,該類只有乙個例項。實現單例模式的要點就是提供乙個私有的無參建構函式。一 餓漢單例模式public class singleobject public static singleobject getinstance 二 懶漢單例模式 懶漢的意思就是慢悠悠的,不著急,也就是在呼...