单例模式:
一个类只能有一个实例对象
单例模式的两种方式:饿汉模式、懒汉模式
饿汉模式
优缺点:
没有任何锁,执行效率高
类加载时就初始化,不管用不用都会初始化,造成内存空间浪费
用途:
- 单例模式比较少的场景
- 启动时一定需要加载的类就可以使用饿汉模式
- 工具类可以考虑使用懒汉模式
//饿汉模式
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();//不是原子性操作 可能发生指令重排序
/*
*1.为对象分配内存空间
*2.初始化对象
*3.将对象指向分配好的内存空间
*在多正常的情况下123,但是指令重排序情况下,可能A线程执行132,B线程判断lazyMan不为null,直接返回lazyMan,但实际lazyMan为null
*/
}
}
}
}
}
静态内部类
//静态内部类
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;
}
}
学习笔记 学习来源狂神说