单例设计模式
饿汉式(高效,无懒加载,线程安全)
类一加载就创建对象由于类加载器是绝对线程安全的,所以不会出现多个实例的问题
懒汉式(低效,懒加载,同步锁)
需要对象的时候再实例化,存在线程安全问题,需要同步锁双重检查锁式(高效,懒加载,不可靠)
由于jvm内存模型问题,会导致执行顺序颠倒的可能,不可靠静态内部类式(高效,懒加载,推荐)
类(包括内部类)不会在外部类初始化时初始化,而是需要的时候初始化,保证懒加载
private static final保证了利用类加载器初始化实例,绝对线程安全
内部类静态原因:非静态内部类,不能拥有静态属性(容易导致内部类不受外部类限制,直接使用类名得到实例)枚举式(高效,无懒加载,绝对安全,推荐)
由jvm底层保证其绝对安全,不被反射和反序列化破解
枚举类天生单例
防止被反射和反序列化破解:
防止被反射
1 | private Demo1(){ |
防止反序列化获取多个对象的漏洞
1 | private Object readResolve() throws ObjectStreamException { |
下面开始举例:
饿汉式
1 | public class Demo1 { |
懒汉式
1 | public class Demo2 { |
双重检查锁
因为不推荐使用,暂不实现
静态内部类式
1 | public class Demo4 { |
枚举式
1 | public enum Demo5 { |
使用反射破解单例模式
1 | public class TestReflect { |