A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© hui847076805 中级黑马   /  2016-11-18 16:35  /  869 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

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

1 个回复

倒序浏览
饿!                        
双检查这个方法是对懒汉模式的进一步优化解决了多线程同时访问时有可能造成的单例失败,这应该也要算到懒汉模式里边吧。。。。。而且有人建议说直接用饿汉模式,代码简单易读懂一个对象也浪费不了多少内存,枚举还没有学到
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马