五種單例模式實現懶漢+餓漢+雙重檢測鎖實現+靜態內部類改進餓漢式+列舉

wangdongli_1993發表於2018-07-09

核心作用:保證一個類只有一個物件,並提供一個訪問該例項的全域性訪問點

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() {}
*/

避免反射漏洞 不能延遲

單例模式反射和反序列化漏洞及解決

 

相關文章