1.單例模式(Singleton Pattern)是 Java 中最簡單的設(shè)計模式之一。
這種類型的設(shè)計模式屬于創(chuàng)建型模式载碌,它提供了一種創(chuàng)建對象的最佳方式猜嘱。
這種模式涉及到一個單一的類,該類負責(zé)創(chuàng)建自己的對象嫁艇,同時確保只有單個對象被創(chuàng)建朗伶。
這個類提供了一種訪問其唯一的對象的方式,可以直接訪問步咪,不需要實例化該類的對象论皆。
目的:保證一個類有且僅有一個實例,并提供一個訪問它的全局訪問點猾漫。
解決問題:管理一個被高頻率使用的類点晴,被頻繁的創(chuàng)建和銷毀。只用單例能更好的節(jié)省程序執(zhí)行時間和減少空間內(nèi)存的使用悯周。
單例模式的實現(xiàn)方式有很多種:懶漢式粒督,餓漢式,雙鎖機制實現(xiàn)禽翼,內(nèi)部類形式屠橄,枚舉類形式;
最著名的就是:懶漢式和餓漢式捐康。
他們各有各的特點仇矾,也各有各的缺點。
2.餓漢式
/**
-
餓漢式 線程安全解总,運行高效贮匕,但長時間占用內(nèi)存。
*/
public class SingletonDemo1 {
private static SingletonDemo1 instance = new SingletonDemo1();private SingletonDemo1() {
System.out.print("創(chuàng)建了:SingletonDemo1");
}public static SingletonDemo1 getInstance(){
return instance;
}
public void eventOperation(){
System.out.print("創(chuàng)建了:SingletonDemo1執(zhí)行了eventOperation");
}
}
3.懶漢式
/**
- 懶漢式 運行耗時花枫,內(nèi)存占用少刻盐,即用即建。有兩種實現(xiàn)方式
*/
public class SingletonDemo2 {
private static SingletonDemo2 instance;
private SingletonDemo2() {
System.out.print("創(chuàng)建了:SingletonDemo2");
}
/**
* 線程安全 多線程使用安全劳翰。synchronized作用域為getInstance敦锌,每次同步都要面對同步問題,小有耗時佳簸。
* @return
*/
public static synchronized SingletonDemo2 getInstance() {
if (null == instance) {
instance = new SingletonDemo2();
}
return instance;
}
/**
* 線程不安全 多線程使用會重復(fù)創(chuàng)建
* @return
*/
public static SingletonDemo2 getInstance1(){
if (null == instance) {
instance = new SingletonDemo2();
}
return instance;
}
public void eventOperation(){
System.out.print("創(chuàng)建了:SingletonDemo2 執(zhí)行了 eventOperation");
}
}
4.雙重鎖機制單例模式
/**
- 雙重鎖機制單例模式乙墙,基于懶漢式發(fā)展而來。雙重鎖機制單例模式其實就是雙重檢查鎖定習(xí)語下的懶漢式生均。所以從本質(zhì)上來說還是懶漢式听想。
- 雙重鎖機制,是指雙重檢查+同步鎖機制马胧。在懶漢式的基礎(chǔ)上能更好的提高時效和空間使用汉买,但是并不能從根本上解決多線程創(chuàng)建問題。原因是jvm的內(nèi)從模型導(dǎo)致雙重檢查和同步鎖失效佩脊。
- 失效的原因是jvm的無序?qū)懭雴栴}蛙粘。所以不建議使用此方式進行單例模式的創(chuàng)建垫卤。
/
public class SingletonDCL {
private volatile static SingletonDCL instance;
private SingletonDCL() {
System.out.print("創(chuàng)建了:SingletonDCL");
}
public static SingletonDCL getInstance(){
/*
* 檢查1
/
if (null == instance) {
/*
* 同步鎖,作用域是創(chuàng)建對象
/
synchronized (SingletonDCL.class){
/*
* 檢查2
*/
if (null == instance) {
instance = new SingletonDCL();
}
}
}
return instance;
}
public void eventOperation(){
System.out.print("創(chuàng)建了:SingletonDCL執(zhí)行了eventOperation");
}
}
5.內(nèi)部類創(chuàng)建方式
/**
-
內(nèi)部類創(chuàng)建方式 線程安全出牧,調(diào)用效率高穴肘,可以延時加載,但是靜態(tài)內(nèi)部類有個通病崔列,就是內(nèi)存泄漏問題梢褐。
*/
public class SingletonDemo3 {private static final SingletonDemo3 instance = new SingletonDemo3();
private SingletonDemo3() {
System.out.print("創(chuàng)建了:SingletonDemo3");
}public static SingletonDemo3 getInstance(){
return SingletonDemo3.instance;
}
public void eventOperation(){
System.out.print("創(chuàng)建了:SingletonDemo3執(zhí)行了eventOperation");
}
}
6.枚舉類方式
/**
-
枚舉類方式 穩(wěn)定旺遮,安全赵讯,簡單優(yōu)雅,但是不可繼承耿眉,擴展性差边翼;
*/
public enum SingletonEnum {
INSTANCE;
public void eventOperation(){
System.out.print("創(chuàng)建了:SingletonEnum執(zhí)行了eventOperation");}
}