美文网首页
单例模式

单例模式

作者: bboymonk | 来源:发表于2017-03-10 12:05 被阅读0次

    运行期间有且仅有一个实例。(比较耗系统性能的时候用单例模式)

    关键点:

    1,一个类只有一个实例,只提供私有的构造器
    2,它必须自行创建这个实例,定义了静态的该类的私有对象
    3,它必须自行向整个系统提供这个实例,提供了一个静态的public方法
    (返回创建或获取本身的静态私有对象)

    懒汉模式:(1,加同步锁synchronized 2,加双重校验锁)

    在类加载时,不创建实例,运行调用时创建。
    类加载快,运行获取对象速度慢。

    package cn.util;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    public class ConfigManager {
        private static ConfigManager configManager;
        private static Properties properties;
        
        private ConfigManager(){
            //文件在src下,所以可以直接写文件名
            String configFile ="jdbc.properties";
            properties = new Properties();
            InputStream is =ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
            try {
                properties.load(is);
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        
        //懒汉模式  线程不安全,在并发的情况下会出现多信configmanager,可以加同步锁解决
        public static synchronized ConfigManager  getInstance(){
            if(configManager == null){
                configManager = new ConfigManager();
            }
            return configManager;
        }
    ====================================================================================
        
            //双重校验锁
        public static ConfigManager getInstance(){
            if(configManager == null){
                synchronized (configManager.class){
                    if(configManager == null){
                        configManager = new ConfigManager();
                    }
                }
            }
            return configManager;
        }
        
        
        
        //单例模式必须给外界提供一个公共方法
        public String getValue(String key){
            return properties.getProperty(key);
        }
      
    }
    

    饿汉模式:线程安全

    在类加载时,就完成初始化,所以类加载慢 ,运行时快。
    //前面private static ConfigManager configManager;直接 new ConfigManager();

    public static ConfigManager getInstance(){
    return configManager;
    }
    

    如何解决饿汉模式Lazy loading??

    可以通过静态内部类:

    private static class ConfigManagerHelp(){
            private static final ConfigManager configManager = new ConfigManager();
        }
        
        public static ConfigManager getInstance(){
            return ConfigManagerHelp.configManager;
        }
    

    相关文章

      网友评论

          本文标题:单例模式

          本文链接:https://www.haomeiwen.com/subject/wrvngttx.html