单例模式
单例模式的介绍
1 单例模式的原理
确保一个类最多只有一个实例,并提供一个全局的访问点
2 单例模式的创建方式
2.1 饱汉模式(懒汉模式)
public class SingleTon{
private SingleTon(){}
//实例化放在静态代码块里,可提高程序的执行效率,但也可能更占空间
private final static SingleTon instance = new SingleTon();
//公共结果,获取对象的实例
public static SingleTon getInstance(){
return instance;
}
}
饱汉模式的优点和缺点
- 优点: 在多线程的情况下,可以保证SingleTon的对象唯一
- 缺点:在多实例或者有其他静态方法时,在启动时没有使用它的时候就已经加载好了,浪费内存。
2.2 饥汉模式
public class SingleTon{
private SingleTon(){}
private static SingleTon instance = null;
public static synchronized SingleTon getInstance(){
if(instance == null){
instance = new SingleTon();
}
return instance;
}
}
饥汉模式的优点和缺点
- 优点:饥汉模式解决了对象没被使用但却分配了内存空间的问题
- 缺点:线程不安全,能防止反序列化、反射产生新的实例。
3 单例模式的优化
3.1 双重检查加锁
public class SingleTon{
//使用关键字volatile修饰变量
private volatile static SingleTon instance = null;
//创建获取对象的接口
private SingleTon(){}
public static SingleTon getInstance(){
if(instance == null){
synchronized(SingleTon.class){
if(instance == null){
instance = new SingleTon();
}
}
}
return instance;
}
}