單例模式(八種實現方式)

2021-10-05 18:41:34 字數 3809 閱讀 2047

/**

* 餓漢單例

* 優點:簡單、執行緒安全

* 缺點:浪費記憶體(我們的單例物件數量不可控的時候,可能會造成記憶體浪費)

*/public class hungraysingleton

//提供全域性訪問點

public final static hungraysingleton getinstance()

}

/**

* 餓漢靜態**塊

*/public class hungraystaticsingleton

public hungraystaticsingleton()

public static hungraystaticsingleton getinstance()

}

/**

* 懶漢式

* 優點:節省資源,效能更高

* 缺點:執行緒不安全

*/public class lazysingleton

/*** 新增synchronized是可以保障線程安全,但是效能會下降

*/public synchronized static final lazysingleton getinstance()

return instance;

}}

/**

* 懶漢雙重檢查鎖

* 優點:效能高,執行緒安全,避免記憶體浪費

* 缺點:不優雅

* */

public class lazydoublechecksingleton

public static final lazydoublechecksingleton getinstance() }}

return instance;

}}

**

* 懶漢,靜態內部類

* 優點:效能高,執行緒安全,避免記憶體浪費

* 缺點:不優雅了

*/public class lazystaticinnerclasssingleton

}public static final lazystaticinnerclasssingleton getinstance()

private final static class lazyholdler

}

/**

* 列舉可以歸到餓漢單例中

* **************************推薦用列舉實現單例******************************

* 最優雅的單例實現模式就是列舉模式。利用列舉的特性,讓jvm來幫我們保證執行緒安全和單一例項的問題。

*/public enum enumsingleton

public string getinstance()

}

/**

* 容器式單例,是列舉式單例的公升級

* spring中的做法,就是這種註冊式單例

*/public class containersingleton

private static mapioc = new concurrenthashmap();

public static object getinstance(string classname) catch (exception e)

return obj;

} else }}

return ioc.get(classname);

}}

/**

* threadlocal 實現單例模式

* 不能保證整個程式唯一;

* 可以保證執行緒唯一;

* 每個執行緒中拿到的例項都是乙個;

* 不同的執行緒拿到的例項不是乙個;

*/public class threadlocalsingleton

};private threadlocalsingleton()

public static threadlocalsingleton getinstance()

}

public class threadlocalrunnable implements runnable 

}

threadlocalsingleton instance = threadlocalsingleton.getinstance();

system.out.println(thread.currentthread().getname() + " : " + instance);

instance = threadlocalsingleton.getinstance();

system.out.println(thread.currentthread().getname() + " : " + instance);

instance = threadlocalsingleton.getinstance();

system.out.println(thread.currentthread().getname() + " : " + instance);

instance = threadlocalsingleton.getinstance();

system.out.println(thread.currentthread().getname() + " : " + instance);

instance = threadlocalsingleton.getinstance();

system.out.println(thread.currentthread().getname() + " : " + instance);

thread t1 = new thread(new threadlocalrunnable());

thread t2 = new thread(new threadlocalrunnable());

t1.start();

t2.start();

system.out.println("program end");

執行結果

main : com.pa.designmode.singleton.threadlocalsingleton@65ab7765

main : com.pa.designmode.singleton.threadlocalsingleton@65ab7765

main : com.pa.designmode.singleton.threadlocalsingleton@65ab7765

main : com.pa.designmode.singleton.threadlocalsingleton@65ab7765

main : com.pa.designmode.singleton.threadlocalsingleton@65ab7765

program end

thread-0 : com.pa.designmode.singleton.threadlocalsingleton@2770f418

thread-1 : com.pa.designmode.singleton.threadlocalsingleton@dc7a4fc

單例設計模式的八種方式

餓漢式 靜態常量 class singleton private final static singleton instance newsingleton public static singleton getinstance 優點 類載入的時候就完成例項化,避免了執行緒同步的問題 不足 沒有懶載入...

7種方式實現單例模式

單例模式,即是整個類有且只有乙個類例項,通過這個唯一的例項為全域性提供服務。單例類的構造方法為私有的,通過乙個暴露給外界的獲取例項方法來呼叫私有構造方法,保證例項的唯一性。因為餓漢式單例在類載入時就初始化了唯一的例項 且只會初始化一次,所以,該例項是唯一的,即 執行緒安全的 因此,如果我們想要為例項...

單例模式(5種實現方式)

1.餓漢式 不支援併發 此模式只能執行在單執行緒下,且類在載入時就已經建立好了例項,不管需不需要用。package com.lys 餓漢式 public class singleton1 private static singleton1 instance new singleton1 public...