java单例模式双重检查 java单例模式

生活知识 2024-10-01 19:33:10
导读 大家好,我是小典,我来为大家解答以上问题。java单例模式双重检查,java单例模式,很多人还不知道,现在让我们一起来看看吧!单例模式大致...
2024-10-01 19:33:10

大家好,我是小典,我来为大家解答以上问题。java单例模式双重检查,java单例模式,很多人还不知道,现在让我们一起来看看吧!

单例模式大致有五种写法,分别为懒汉,恶汉,静态内部类,枚举和双重校验锁。

1、懒汉写法,常用写法

class LazySingleton{

    private static LazySingleton singleton;

    private LazySingleton(){

    }

    public static LazySingleton getInstance(){

        if(singleton==null){

            singleton=new LazySingleton();

        }

        return singleton;

    }   

}2、恶汉写法,缺点是没有达到lazy loading的效果

class HungrySingleton{

    private static HungrySingleton singleton=new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton getInstance(){

        return singleton;

    }

}3、静态内部类,优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading

class InternalSingleton{

    private static class SingletonHolder{

        private final static  InternalSingleton INSTANCE=new InternalSingleton();

    }   

    private InternalSingleton(){}

    public static InternalSingleton getInstance(){

        return SingletonHolder.INSTANCE;

    }

}4、枚举,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象

enum EnumSingleton{

    INSTANCE;

    public void doSomeThing(){

    }

}5、双重校验锁,在当前的内存模型中无效

class LockSingleton{

    private volatile static LockSingleton singleton;

    private LockSingleton(){}

    //详见:http://www.ibm.com/developerworks/cn/java/j-dcl.html

    public static LockSingleton getInstance(){

        if(singleton==null){

            synchronized(LockSingleton.class){

                if(singleton==null){

                    singleton=new LockSingleton();

                }

            }

        }

        return singleton;

    }

}参考自:http://www.oschina.net/code/snippet_107039_6062

本文到此讲解完毕了,希望对大家有帮助。

免责声明:本文由用户上传,如有侵权请联系删除!