美文网首页
001 单例模式 | 5种实现方式

001 单例模式 | 5种实现方式

作者: __destory__ | 来源:发表于2019-03-20 14:01 被阅读0次

饿汉

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() { }
    public static Singleton getInstance() {
        return instance; 
    }
}

私有化构造函数,创建内部静态对象,通过静态方法返回。
或者如下,一个效果

public class Singleton {
    private static Singleton instance = null;
    static {
        instance = new Singleton();
    }
    private Singleton() { }
    public static Singleton getInstance() {
        return this.instance; 
    }
}

缺点,没有按需求创建对象,导致资源浪费

懒汉

按需生成全局唯一对象

public class Singleton {
    private static Singleton instance = null;
    private Singleton() { }
    public static Synchronized Singleton getInstance() {
          if (instance == null) {
                instance = new Singleton();
          }
        return instance;
    }
}

缺点,Synchronized会导致每次访问,都需要加锁和释放锁,而实际下对象已经有了,何必还这么做,资源浪费。

双重校验

懒汉的变种,提高性能,按需生成对象,后续不需要加锁。

public class Singleton {
    private static Singleton instance = null;
    private Singleton() { }
    public static Singleton getInstance() {
        if (instance == null) { //如果已经初始化,不需要加锁了
            synchronized(Singleton.class) { //未初始化时候会产生竞争,
                if (instance == null) { //第二重校验,为了方式被唤醒的进程再次初始化
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

以上代码,提升性能,但是会有指令重排的问题,指令重排,是JVM优化代码的过程,再不影响最终结果的时候,调整指令执行顺序,这样,会导致双重校验失效,改进,使用volatile

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton() { }
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null){
                    instance = new Singleton();
                }
            }
        }
       return instance; 
    }
}

静态内部类

public class StaticSingleton {
    private StaticSingleton() {}
    private static class SingletonHolder {
        private static StaticSingleton INSTANCE = new StaticSingleton();
    }
    
    public static StaticSingleton  getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

枚举

上述方法虽然可以通过私有化构造函数实现单列,但是通过反射机制,仍然可以强行构造新的对象,StaticSingleton tmp=(StaticSingleton)Class.forName("com.xx.StaticSingleton").newInstance();

因此,使用枚举,可以避免这个

  • 枚举的构造函数必须是私有
  • 枚举中的属性必须放在最前面,通常大写
  • 枚举中可以定义方法,属性可以重写方法,引用方法
public enum TrafficLamp {
    RED(30) {
         //实现抽象方法
        public TrafficLamp nextLamp() {
            return GREEN;
        }
    },
    GREEN(20) {
        public TrafficLamp nextLamp() {
            return YELLOW;
        }
    },
    YELLOW(10) {
        public TrafficLamp nextLamp() {
            return RED;
        }
    };

    //抽象方法
    public abstract TrafficLamp nextLamp();

    private int time;

    private TrafficLamp(int time) {
        this.time = time;
    }

    public static void main(String[] args) {
        try {
            TrafficLamp tmp=(TrafficLamp)Class.forName("com.roocon.thread.t5.TrafficLamp").newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

这里面的,RED GREEN YELLOW 都是单例的,而且,对枚举进行反射会报错,

java.lang.InstantiationException: com.roocon.thread.t5.TrafficLamp
    at java.lang.Class.newInstance(Class.java:427)
    at com.roocon.thread.t5.TrafficLamp.main(TrafficLamp.java:30)
Caused by: java.lang.NoSuchMethodException: com.roocon.thread.t5.TrafficLamp.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    ... 1 more

相关文章

  • 单例模式的常用实现方式

    单例模式属于最常用的设计模式,Java中有很多实现单例模式的方式,各有其优缺点 实现方式对比 单例实现方式线程安全...

  • 设计模式--单例模式

    单例模式概述 单例模式实现方式 为什么要使用单例模式 单例模式实现方式 饿汉式 类加载后就会将对象加载到内存中,保...

  • kotlin实现单例模式

    1.懒汉式实现单例模式 2.线程安全懒汉式实现单例模式 3.双重校验懒汉式实现单例模式 4.静态内部类方式实现单例模式

  • Python经典面试题21道

    1、Python如何实现单例模式? Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模...

  • Python最经典面试题21道,必看!

    1、Python如何实现单例模式? Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模...

  • Python 经典面试题

    1、Python如何实现单例模式? Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模...

  • Python 经典面试题

    1、Python如何实现单例模式? Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模...

  • 单例模式(Singleton)- 通俗易懂的设计模式解析

    单例模式的实现方式单例模式的实现方式有多种,根据需求场景,可分为2大类、6种实现方式。具体如下: a. 初始化单例...

  • 单例模式

    什么是单例模式? 一个类只允许创建一个实例,那个类就是单例类。这个模式就是单例模式。单例模式实现方式:饿汉式:实现...

  • 2018-06-19 Python中的单例模式的几种实现方式的及

    转载自: Python中的单例模式的几种实现方式的及优化 单例模式 单例模式(Singleton Pattern)...

网友评论

      本文标题:001 单例模式 | 5种实现方式

      本文链接:https://www.haomeiwen.com/subject/byuzmqtx.html