浅谈单例模式
Posted 永远年青
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈单例模式相关的知识,希望对你有一定的参考价值。
单例模式其实我们再熟悉不过了,线程安全单例模式的写法是如下这样的:
public class Singleton {
private Singleton(){ System.out.println("单例类Singleton的构造函数私有..."); }
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance; }
public static void doAnotherThing(String str){ System.out.println(str+":单例类Singleton还有其他角色..."); } }
上面这个单例模式的写法虽然线程安全,但是假如在执行doAnotherThing静态方法时,Singleton的构造函数也会被执行,就是说Singleton会被加载进去,但是至于能不能用上还不确定,所以可能会存在一定的资源浪费和性能问题。
那么getInstance()方法可以改成这样,前面的instance直接指向空:
if (instance == null){ instance = new Singleton(); }
这样虽然解决问题了,但是线程又不安全了,你可能会说加上同步关键字,那这样的话性能依然还是有问题。
有如下这样的写法可以两全其美:
public class StaticSingleton {
private StaticSingleton(){ System.out.println("单例类StaticSingleton的构造函数私有..."); }
private static class SingletonHolder{
private static StaticSingleton instance = new StaticSingleton(); }
public static StaticSingleton getInstance(){
return SingletonHolder.instance; }
public static void doAnotherThing(String str){ System.out.println(str+":单例类Singleton还有其他角色..."); } }
我们都知道类在被加载时,其内部类是不会被初始化的,只有在用到getInstance()的时候SingletonHolder内部类才被加载。可见这种单例模式是兼具线程安全和性能的完美方案,其实这种方式有点类似代理。
以上是关于浅谈单例模式的主要内容,如果未能解决你的问题,请参考以下文章