单例模式:
读取配置文件的工具类。运行期间有,且只有一个实例
单例提高系统性能减少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();//自行创建 的