一个类只能有一个实例对象
单例模式的两种方式:饿汉模式、懒汉模式
饿汉模式
优缺点:
没有任何锁,执行效率高
类加载时就初始化,不管用不用都会初始化,造成内存空间浪费
用途:
单例模式比较少的场景启动时一定需要加载的类就可以使用饿汉模式工具类可以考虑使用懒汉模式
//饿汉模式
public class Hungry {
private Hungry(){}
private static final Hungry hungry = new Hungry();
public static Hungry getInstance(){
return hungry;
}
}
懒汉模式:双重检测锁
//懒汉模式
public class LazyMan(){
private LazyMan(){}
// volatile 提供线程可见性,禁止指令重排序
private volatile static LazyMan lazyMan;
public static LazyMan getInstance(){
if(lazyMan=null){
synchronized(LazyMan.class){
if(lazyMan=null){
lazyMan=new LazyMan();//不是原子性操作 可能发生指令重排序
}
}
}
}
}
静态内部类
//静态内部类
public class LazyMan02 {
private LazyMan02 (){}
public static LazyMan02 getInstance(){
return InnerClass.LazyMan02 ;
}
static class InnerClass{
private static final LazyMan02 LazyMan02 = new LazyMan02 ();
}
}
枚举
反射破解不成功
1、普通编译欺骗开发者,enum枚举是无参构造
2、实际enum枚举是有参构造
3、通过反射破解枚举会抛出异常
//枚举 本身也是一个class类 默认继承Enum 类
public enum EnumDemo {
INSTANCE;
public static EnumDemo getInstance(){
return INSTANCE;
}
}
学习笔记 学习来源狂神说



