根据b站UP主狂神说JUC课程所写的个人学习笔记
视频地址:https://www.bilibili.com/video/BV1B7411L7tE?from=search&seid=14761503393031794075
饿汉式,懒汉式
饿汉式
public class Hungry { //可能会浪费空间 private byte[] data1 = new byte[1024*1024]; private Hungry(){ } private final static Hungry HUNGRY = new Hungry();//保证唯一 public static Hungry getInstance(){ return HUNGRY; } }
DCL懒汉式
//懒汉式 public class LazyMan { private static boolean lin = false; private LazyMan(){ synchronized (LazyMan.class){ if(lin == false){ lin = true; } else{ throw new RuntimeException("不要用反射破坏异常"); } }} private volatile static LazyMan lazyMan ; //双重锁模式的懒汉式单例 DCL懒汉式 public static LazyMan getInstance(){ //加锁 if (lazyMan==null){ synchronized (LazyMan.class){//静态方法锁的是类 if (lazyMan==null){ lazyMan = new LazyMan();//不是原子性操作 //1.分配内存空间 2.执行构造方法 3.把这个对象指向这个空间 有可能发生指令重排 } } } return lazyMan; }
静态内部类
//静态内部类 public class Holder { private Holder(){ } public static Holder getInstance(){ return InnerClass.HOLDER; } public static class InnerClass{ private static final Holder HOLDER = new Holder(); } }
单例不安全,因为有反射
枚举
public enum Enum { INSTANCE; public Enum getInstance(){ return INSTANCE; } }