单例模式
概述 : 单例模式属于创建模式
,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时在整个程序有且仅有一个实例对象.并且提供一个全局的访问点访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象.
特点 :
- 单例类只有一个实例(且为自我实例化)
- 持有自己类型的属性
- 类构造器私有,对外提供获取实例的静态方法
单例模式的实现方式
1 饿汉式
线程安全,比较常用,但容易产生垃圾,因为一开始就初始化
/**
* 饿汉式单例模式
*/
public class SingletonDemo1 {
// 类初始化,立即加载这个对象(迫不及待就加载)
private static SingletonDemo1 instance = new SingletonDemo1();
// 类构造器私有
private SingletonDemo1(){}
// 对外提供获取静态的实例方法(线程安全)
public static SingletonDemo1 getInstance(){
return instance;
}
}
/*
饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,
以后不再改变,所以是线程安全的,可以直接用于多线程而不会出现问题。
*/
2 懒汉式(什么时候用什么时候在加载)
package SingletonDemo;
/**
* 懒汉式单例模式(什么时候用什么时候加载)
*/
public class SingletonDemo2 {
// 类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)。
private static SingletonDemo2 instance;
// 类构造器私有
private SingletonDemo2(){}
//方法同步,调用效率低!
public static synchronized SingletonDemo2 getInstance(){
if(instance==null){
instance = new SingletonDemo2();
}
return instance;
}
}
注意 : 线程不安全, 但是为了线程安全可以加上 synchronized
关键字,但是与此同时的是可能在加载代码的过程中付出惨重的效率代价.
网友评论