几种常见的单例的设计方式

第一种:非延迟加载单例类(饿汉式)

package test;

public class Singleton {
    private Singleton() {
    }

    private static final Singleton instance = new Singleton();

    public static Singleton getInstance() {
	return instance;
    }
}

第二种:同步延迟加载(懒汉式)

package test;

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
	if (instance == null) {
	    instance = new Singleton();
	}
	return instance;
    }
}

饿汉式是在类装载时直接得到该类的实例,而懒汉式在等到真正使用的时候调用工厂方法进行创建实例。因此,前者速度快,后者速度慢。但后者可以加载其他的类,(也就是动态扩展)灵活性高。

第三种:双重检测同步延迟加载(JDK5.0以上版本支持

package test;

public class Singleton {
    private volatile static Singleton instance = null;

    private Singleton() {
    }

    public static Singleton getInstance() {
	if (instance == null) {
	    synchronized (Singleton.class) {
		if (instance == null) {
		    instance = new Singleton();
		}
	    }
	}
	return instance;
    }
}

双重检测同步延迟加载是为了解决非延迟加载方式过多的同步产生瓶颈问题。

第四种:使用ThreadLocal修复双重检测

package test;

public class Singleton {
    private static final ThreadLocal perThreadInstance = new ThreadLocal();
    private static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getInstance() {
	if (perThreadInstance.get() == null) {
	    createInstance();
	}
	return singleton;
    }

    private static final void createInstance() {
	synchronized (Singleton.class) {
	    if (singleton == null) {
		singleton = new Singleton();
	    }
	}
	perThreadInstance.set(perThreadInstance);
    }
}

第五种:使用内部类实现延迟加载
package test;

public class Singleton {
    private Singleton() {
    }

    public static class Holder {
	static Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
	return Holder.instance;
    }
}

事实上第三种双重检测同步延迟加载方式已经是安全的了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值