单例模式(懒汉方式和饿汉方式)+双重检验锁
单例模式的概念:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
- 1)一个类只有一个实例 这是最基本的
- 2)它必须自行创建这个实例
- 3)它必须自行向整个系统提供这个实例
私有成员变量
private static Singleton singleton ;
private static Properties properties;
私有构造 将构造方法私有化,不允许外部直接创建对象
private Singleton(){
InputStream is=null;
try {
properties=new Properties();
//把配置文件加载到is流
is=Singleton.class.getClassLoader().getResourceAsStream("database.properties");
//通过Properties读取is流
properties.load(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(is!=null){
is.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
饿汉模式
在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
- 创建类的唯一实例
- 静态,不用同步(类加载时已初始化,不会有多线程的问题)
public static Singleton getinstance(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
懒汉模式
Singleton类进内存,对象还没有存在,只有调用getInstance方法,才建立对象
比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢
公开访问点getInstance—–不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回
public static synchronized Singleton getinstance(){
singleton =new Singleton ();
return singleton ;
}
双重检验锁
public static synchronized Singleton getinstance(){
if(singleton==null){
synchronized (Singleton .class) {
if(singleton ==null){
singleton =new Singleton ();
}
}
}
return singleton;
}
通过键取得值
*提供一个用于获取实例的方法 使用public static修饰符*
*面向对象的封装性要求控制访问,不允许其他类直接访问本类的成员变量(私有化)*
public static String getvalues(String key){
return properties.getProperty(key);
}
总结:
为什么要用单例模式:
*单利模式是用来保证一个类在运行期间只会被创建一个实例,节省系统的运行内存,选择单例模式就是为了避免不一致状态,避免政出多头。*
怎么选择单例模式(饿汉模式和懒汉模式区别):
*饿汉模式:类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在 *
*懒汉模式:懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。*