五種單例模式實現懶漢+餓漢+雙重檢測鎖實現+靜態內部類改進餓漢式+列舉
核心作用:保證一個類只有一個物件,並提供一個訪問該例項的全域性訪問點
package xidian.lili.thread.syn;
/**
1.建立單例模式(懶漢式+雙重檢測鎖實現)
構造器私有化 確保外部不能建立物件
建立私有靜態變數,先不初始化,用的時候再初始化(資源利用率高了)
建立對外的公共靜態方法(加同步,併發效率低)建立物件指向私有靜態變數並返回
*/
public class MyJvm {
private static MyJvm jvm;建立私有靜態變數
private MyJvm(){
構造器私有化
}
public static MyJvm getInstance3() throws InterruptedException{
//雙重檢查 提高效率
if(jvm==null){//如果已經有物件 執行緒都不在等待 沒有物件在進去
synchronized(Jvm.class){//同步快 不能this物件 靜態方法中沒有this物件 放入類的位元組碼資訊 效率低
if(jvm==null){
jvm=new MyJvm();
}
}
}
return jvm;
}
}
/**
餓漢式 建立單例模式
構造器私有化 確保外部不能建立物件
建立私有靜態變數+建立物件(類在初始化時,就載入這個物件,JVM載入類時天然保證執行緒安全,不延時,但是隻是載入類,不用到物件這樣就會造成資源浪費)
建立對外的公共靜態方法(方法不加同步 效率高)返回私有靜態變數
*
*/
class MyJvm2 {
//由於是靜態方法 類載入時就會建立物件 執行緒安全 可是效率低 沒有使用該類物件就建立了 所以改進,把建立物件放在內部類中
private static MyJvm2 jvm=new MyJvm2();
private MyJvm2(){
}
public static MyJvm2 getInstance() throws InterruptedException{
return jvm;
}
}
改進:靜態內部類實現兼具延遲載入和併發高效
class MyJvm3{
//加入靜態內部類進行包裹
//載入了MyJvm3 不會載入MyJvmhold 只有在使用的時候 比如呼叫getInstance() 方法在載入建立物件
//載入類時屬性會被初始化 方法不會
private static class MyJvmhold{
private static MyJvm3 jvm=new MyJvm3();
}
private MyJvm3(){
}
public synchronized static MyJvm3 getInstance() throws InterruptedException{
return MyJvmhold.jvm;
}
}
/**
在jdk裡的單例設計模式Runtime 餓漢式
public class Runtime {
private static Runtime currentRuntime = new Runtime();//屬性建立物件
//公開訪問物件
public static Runtime getRuntime() {
return currentRuntime;
}
//構造方法私有化
private Runtime() {}
*/
避免反射漏洞 不能延遲
單例模式反射和反序列化漏洞及解決
相關文章
- 設計模式:單例模式介紹及8種寫法(餓漢式、懶漢式、Double-Check、靜態內部類、列舉)設計模式單例
- scala:分別使用懶漢式和餓漢式實現單例模式單例模式
- java單例模式懶漢和餓漢Java單例模式
- 詳談單例、餓漢、和懶漢模式單例模式
- C#單例—餓漢式和懶漢式C#單例
- 設計模式:單例模式 (關於餓漢式和懶漢式)設計模式單例
- 懶漢模式和餓漢模式模式
- 【java】單例設計模式——餓漢式和懶漢式、Runtime、TimerJava單例設計模式
- java學習回顧---懶漢式和餓漢式Java
- C++之this指標、拷貝構造、賦值構造、單列模式(餓漢模式、懶漢模式)C++指標賦值模式
- 餓漢模式C++模式C++
- 靜態內部類實現的單例模式是執行緒安全的單例模式執行緒
- java設計模式之單例模式你真的會了嗎?(懶漢式篇)Java設計模式單例
- 別再用懶漢模式了——從JVM的角度看單例模式模式JVM單例
- Java 利用列舉實現單例模式Java單例模式
- WPF實現Win10漢堡選單Win10
- 五種方式實現 Java 單例模式Java單例模式
- Python實現:漢諾塔問題Python
- 漢羅塔問題 java實現Java
- PHP實現漢諾塔演算法PHP演算法
- PHP 實現字串翻轉(包含中文漢字)的實現PHP字串
- 461.漢明距離(c++實現)C++
- 單例模式:5種實現方式單例模式
- 單例模式的各種實現單例模式
- 單例模式的五種實現方式及優缺點單例模式
- Python 5種方法實現單例模式Python單例模式
- 【設計模式】實現執行緒安全單例模式的五種方式設計模式執行緒單例
- 剖析漢字描紅在flutter中的實現原理Flutter
- JS中的單例模式及單例模式原型類的實現JS單例模式原型
- java和C++之單例類雙重檢查加鎖JavaC++單例
- 漢字轉漢語拼音
- 內部類與靜態內部類
- Java 實現單例模式的 9 種方法Java單例模式
- Python單例模式(Singleton)的N種實現Python單例模式
- 單例模式的各種實現方式(Java)單例模式Java
- JS實現單例模式的多種方案JS單例模式
- 使用訊號量Semaphore實現沒有飢餓問題的鎖
- PHP實現單例模式PHP單例模式