保证一个类里只有一个实例;提供唯一公共访问点,一般在序列化、反序列化过程中、反射、克隆过程中会失效
1.饿汉式加载
2.懒汉式加载
3.双重检测锁
4.内部静态类
双亲委派机制,保证类只能被一个类加载器加载,保证加载同一个类;
5.枚举类
本质上自动转换枚举类里的对象,生产饿汉式;
反射:
反射中可以获得类的构造方法并强制设置为可达,从而产生新的对象;
解决办法:在构造方法里判断非空则返回对象;
序列化反序列化:
反序列,找到类时会进行一次实例化;同时通过反射寻找readReslove方法,如果有则再生成一个实例化对象,通过比较两个对象,然后返回;
解决办法:添加 public Object readReslove()返回实例;
克隆:不会调用构造函数,直接从内存里复制一份;
解决办法:重写 protected Object clone()返回实例;
深拷贝、浅拷贝:
clone对象是深拷贝,但是如果对象里面还有引用类型的对象,引用类型的对象就是浅拷贝,只复制地址;
参考
https://blog.youkuaiyun.com/qq_39304851/article/details/115679982