码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2016-06-20 19:08:14      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:设计模式 单例模式 懒汉式 饿汉式

核心作用:

    保证一个类只有一个实例,并提供一个访问该实例的全局访问点

单例的三大要点:


  • 线程安全

  • 延迟加载

  • 序列化与反序列化安全


常见场景:

    1. 读取配置文件

    2. 网站计数器

    3. 日志应用

    4. 连接池

    5. spring中每个bean默认就是单例

    6. servlet


常见五中实现方式:

懒汉式:

    线程安全,调用效率高,不能延迟加载

饿汉式:

    线程安全,调用效率不高,可以延迟加载

双重检测锁式:

    非线程安全,偶尔会出现问题,不建议使用

静态内部类式:

    线程安全,调用效率高,可以延迟加载

枚举单列:

    线程安全,调用效率高,不能延迟加载



懒汉式

/**
 * 懒汉式单例模式
 * 特点:线程安全,调用效率不高,可以延迟加载
 * @author Roger
 */
public class SingletonDemo3 {
    // 类初始化时,不初始化,延迟加载
    private static SingletonDemo3 instance = null;
    private SingletonDemo3(){ // 私有构造器
    }
    // 方法同步,调用效率低
    public static synchronized SingletonDemo3 getInstance(){
        if(instance == null){
            instance = new SingletonDemo3();
        }
        return instance;
    }
}


饿汉式

/**
 * 饿汉式单例模式
 * 特点:线程安全,调用效率高,不能延迟加载
 * @author Roger
 */
public class SingletonDemo1 {
    // 类初始化时,立即加载,天然的线程安全
    private static SingletonDemo1 instance = new SingletonDemo1();
    private SingletonDemo1(){ // 私有构造器
    }
    public static SingletonDemo1 getInstance(){
        return instance;
    }
}


枚举

/**
 * 枚举 单例模式
 * 特点:线程安全,调用效率高,不能延迟加载,避免反射和反序列号漏洞
 * @author Roger
 */
public enum SingletonDemo5 {
    /**
     * 这个枚举原始,本身就是单例模式
     */
    INSTANCE;
    // 添加自己需要的操作
    public void singletonOperation(){
        System.out.println("这是一个枚举单列");
    }
}


静态内部类法

/**
 * 静态内部类法 单例模式
 * 特点:线程安全,调用效率高,可以延迟加载
 * @author Roger
 */
public class SingletonDemo4 {
    // 初始化SingletonDemo4类时不会初始化该内部类,实现延迟加载
    private static class SingletonInstance{
        private static SingletonDemo4 instance = new SingletonDemo4();
    }
    private SingletonDemo4(){ // 私有构造器
    }
    public static SingletonDemo4 getInstance(){
        return SingletonInstance.instance;
    }
}


双重检测锁式

/**
 * 双重检查锁单例模式
 * 特点:非线程安全,偶尔会出现问题,不建议使用
 * @author Roger
 */
public class SingletonDemo2 {
    private static volatile SingletonDemo2 singleton = null;
    private SingletonDemo2(){}
    public static SingletonDemo2 getSingleton(){
        if(singleton == null){
            synchronized (SingletonDemo2.class){
                if(singleton == null){
                    singleton = new SingletonDemo2();
                }
            }
        }
        return singleton;
    }    
}


本文出自 “10950988” 博客,请务必保留此出处http://10960988.blog.51cto.com/10950988/1791012

单例模式

标签:设计模式 单例模式 懒汉式 饿汉式

原文地址:http://10960988.blog.51cto.com/10950988/1791012

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!