java有23中设计模式,单例模式是最简单的,也是使用频率比较高的,但是实现方式有很多种,接下来我们介绍常用的几种方式。
饿汉方式
package com.single.instance;
public class Sun {
private Sun() {}
private static final Sun instance = new Sun();
public static Sun getInstanceSun() {
return instance;
}
}
所谓的饿汉就是在类初始化的时候,我们就给对象实例化。
优点:代码简单,调用快
缺点:类初始化的时候就要创建对象。
懒汉方式(非线程安全)
package com.single.instance;
public class Moon {
private Moon(){};
private static Moon instance;
public static Moon getInstanceMoon(){
if(instance==null){
instance=new Moon();
}
return instance;
}
}
所谓的懒汉的就是,在我调用的获取对象方法的时候,才去创建对象。但是懒汉又可以分为,线程安全,线程不安全,以上是线程不安全的实现方式,如果在多线程中可能就会出错。
懒汉方式(线程安全)
package com.single.instance;
public class Moon {
private Moon() {
};
private static Moon instance;
public static Moon getInstanceMoon() {
if (instance == null) {
synchronized (Moon.class) {
if (instance == null) {
instance = new Moon();
}
}
}
return instance;
}
}
懒汉线程安全,是在非安全的基础上加了特定的条件和同步锁,双重判定解决线程安全的问题。
静态内部类
package com.single.instance;
public class Single {
private Single() {
};
private static class Singlehodle {
private static final Single instances = new Single();
}
public static Single getInstance() {
return Singlehodle.instances;
}
}
Single 类时并不会初始化instances ,只有第一次调用getInstance方法时虚拟机加载
SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类的唯一性,所以
推荐使用静态内部类单例模式
总结:单例模式的实现步骤
1.私有构造
2.创建对象引用
3.定义对外提供的方法获取单例对象