单例模式

单例模式: 

读取配置文件的工具类。运行期间有,且只有一个实例

单例提高系统性能减少io操作

关键点:

   1.一个类只有一个实例----最基本的--(只提供私有的构造器)

  2. 他必须自行创建这个实例。(定义了私有的静态的该类的共有的方法)

  3. 他必须自行向整个系统这个实例提供一个静态的共有的方法,返回创建或获取本身静态的私有对象

import java.util.Properties;

public class ConfigManager {
    private static ConfigManager configManage;
    private static Properties properties;
   //私有构造器   防止外界new实例   
    private ConfigManager() {
    //读io 减少系统的消耗
    String configFile="database.properties";
    properties=new Properties();
    //通过classpath找资源
    InputStream is=ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
    try {
        properties.load(is);
    } catch (IOException e) {
        e.printStackTrace();
    }

   } 
    
    //全局访问点    懒汉模式线程不安全
    public static ConfigManager getInstance(){
        if(configManage==null){
            configManage=new ConfigManager();
        }
        return configManage;
    }
   
    public String getValue(String key){
        return properties.getProperty(key);
    }
}

这是懒汉模式的实例,线城市不安全的,在并发的环境下很有可能会出现多个ConfigManager

改进: 1. 需要考虑同步加锁的方法synchronized

 //全局访问点    懒汉模式线程不安全
    public static synchronized ConfigManager getInstance(){  //这样就OK了
        if(configManage==null){
            configManage=new ConfigManager();
        }
        return configManage;
    }

2.但是这种方法采用的几率不高,通常都采用双重校验锁的方法解决问题。
public static  ConfigManager getInstance(){ 
        if(configManage==null){
           synchronised(configManage.class){
             if(configManage==null){
         configManage=new ConfigManager();
             }
             }
            
        }
        return configManage;
    }

  饿汉模式

public class Singleton{
    
public static  Singleton singleton;
static {     //静态代码块类加载时执行
  singleton=new Singleton();
  }
private Singleton(){}

public static Singleton getInstance(){

return singleton;
}




}

小结:

懒汉模式:
线程不安全的,需要使用同步锁的方法和双重校验锁
懒汉比较懒,在类加载的时候不会创建实例,在实例运行时再创建
这样类加载快,运行的时候获取对象的速度就会慢,少了内存的消耗。
懒汉延迟加载:lazy loading
饿汉模式:
线程是安全的,在类的加载的时候就自行初始化,所以类加载慢,但运行时获取对象就快了
public static ConfigManager configManager=new ConfingManager();//自行创建 的
 





posted @ 2017-08-24 10:14  春眠不觉笑  阅读(129)  评论(0编辑  收藏  举报