單利模式的幾種寫法

2021-10-19 18:28:00 字數 1846 閱讀 9138

//懶漢式: 在類初始化的時候建立該物件的例項, 執行緒安全. 缺點如果該物件沒有引用會造成資源占用

/** 懶漢式1

*/public class singleton

public static singleton getinstance()

}/**

懶漢式2

*/public class singleton

private singleton(){}

public static singleton getinstance()

}

//餓漢式: 在需要此例項的時候獲取該例項

/**/

public class singleton

public static singleton getinstance()

return instance;

}}/*

餓漢式2: 使用synchronized

*/public class singleton

private static singleton instance;

public static synchronized singleton getinstance()

return instance;

}}/*

餓漢式3: 雙重檢查

*/public class singleton

private static volatile singleton instance;

public static singleton getinstance() }}

return instance; //⑤

}/*

ps: 在此方法中使用了volatile 關鍵字的目的是禁止指令重排

在多執行緒訪問中可能會出現返回空物件的錯誤; 在單執行緒時 是不會出現問題的.

因為 instance = new singleton(); //④ 在執行的時候會分為三步

1.為 instance 分配記憶體空間

2.初始化 instance

3.將instance 指向分配的記憶體空間

在jvm執行的時候 可能會存在 將執行順序改變 1-3-2

例如: 執行緒一 執行在1處判斷無此物件. 繼續執行到2處 獲取鎖 繼續執行3處判斷無此物件 則直接

執行4 此時jvm的執行順序恰好為1-3-2.

此時執行緒2 獲取物件,執行到 1處 判斷 該物件是否為空, 但是執行緒1jvm執行順序恰好是3 但

是沒有執行到2 此時.執行緒2得到的該物件的位址不為空直接返回的實際是乙個空物件.

多執行緒情況下將會得到空物件 所以加上 volatile 關鍵字.

*/}

/* 靜態內部類*/

public class singleton

public static class singletonholder

public static singleton getsingleton()

}

/*

列舉 不近可以解決執行緒同步 還可以防止反序列化

序列化和反序列化為什麼在單例模式的時候要注意這一點呢?

* 因為無論的懶漢式 , 還是餓漢式. 如果通過反射的話都可以獲取新的例項.

* 那麼只有列舉類的方式才是能夠獲取唯一物件的.

* 為什麼列舉類能夠獲取唯一物件呢?

* 原因是列舉類是沒有構造方法的 通過反射是獲取不到的 所以無法建立物件

*/public enum singleton

單例模式的幾種寫法

所謂單例模式就是確保某乙個類只有乙個例項,並且提供乙個全域性訪問點。例如 執行緒池 快取 對話方塊等等 1 餓漢模式 保證執行緒安全 public class singleton public static singleton getinstance 2 懶漢模式 不保證執行緒安全 public c...

單例模式的幾種寫法

1.懶漢式 public class singleinstance1 private static singleinstance1 instance public static singleinstance1 getinstance return instance 該程式缺點是執行緒不安全 publ...

單例模式的幾種寫法

1.餓漢式 public class singleton 宣告成員變數 private static singleton singleton new singleton 對外提供介面獲取該例項 public static singleton getinstance 2.懶漢式 public clas...