单例设计模式
什么是单例设计模式
只有一个实例对象 保证对象是唯一的
饿汉式单例
代码:
public class EHan {
//创建之后会存放在永久区中 垃圾回收机制不会回收
private static final EHan EHAN = new EHan();
//构造函数
private EHan() {
}
public static EHan getInstance() {
return EHAN;
}
public static void main(String[] args) {
EHan instance = EHan.getInstance();
EHan instance1 = EHan.getInstance();
System.out.println(instance==instance1);
}
}
饿汉式天生线程安全,在类加载的时候就会创建对象,创建之后会存放在jvm的永久区中,回收机制不会回收,不使用就会浪费内存
懒汉式单例
public class LanHan {
private static LanHan lanHan;
private LanHan() {
}
public static LanHan getInstance() {
if (lanHan == null) {
synchronized (LanHan.class) {
lanHan = new LanHan();
}
}
return lanHan;
}
public static void main(String[] args) {
LanHan instance = LanHan.getInstance();
LanHan instance1 = LanHan.getInstance();
System.out.println(instance == instance1);
}
}
懒汉式线程不安全,为了保证一个线程进去访问对象,需要加上同步锁,同步锁 影响了程序执行效率
线程安全
枚举方式
public class MeiJu {
private MeiJu() {
}
static enum enumMeiJu {
Instance;
private MeiJu meiJu;
private enumMeiJu() {
meiJu = new MeiJu();
}
public MeiJu getInstance() {
return this.meiJu;
}
}
public static MeiJu getInstance() {
return enumMeiJu.Instance.getInstance();
}
public static void main(String[] args) {
MeiJu instance = MeiJu.getInstance();
MeiJu instance2 = MeiJu.getInstance();
System.out.println(instance == instance2);
}
}
1. 枚举天生单例 使用枚举实现单例模式实现简单效率高
2. 可以防止反射获取单例对象 会报错
3. 当一个类定义一个枚举的时候 编译之后会默认继承java.lang.Enum 该类上面会加上final 不能被继承