介绍:
所谓单例模式就是采用一定的方法保证在整个系统的运行中,对某个类只能存在一个实例对象,并且该类只提供一个对外暴露的获取实例对象的静态方法
单例模式的八种写法
饿汉式(静态常亮)
private Single(){}private final static Single single = new Single();public static Single getInstance(){return single;}
分析:
优点:类加载就创建了,是线程安全的
缺点:当系统用不到的时候,就会占用系统内存
饿汉式(静态代码快)
private Single(){}private static Single single;static {single = new Single();}public static Single getInstance(){return single;}
分析:
优点:类加载就创建了,是线程安全的
缺点:当系统用不到的时候,就会占用系统内存
懒汉式(线程不安全)
public class Single {private Single(){}private static Single single;public static Single getInstance(){if (null == single){return new Single();}return single;}}
分析:
优点:起到了懒加载的效果,但是只能在单线程下使用
缺点:多线程下线程不安全 实际开发中不建议使用
懒汉式(线程安全,同步方法)
public class Single {private Single(){}private static Single single;public static synchronized Single getInstance(){if (null == single){return new Single();}return single;}}
分析:
优点:起到了懒加载的效果,是线程安全的
缺点:synchronized是重量级锁,每次获取都要获取锁影响系统性能 在开发中不建议使用
懒汉式(线程不安全 同步代码块)
public class Single {private Single(){}private static Single single;public static Single getInstance(){if (null == single){synchronized(Single.class){return new Single();}}return single;}}
分析:
优点:起到了懒加载的效果
缺点:多线程下,线程不安全 在开发中不建议使用
懒汉式(双重检查)
public class Single {private Single(){}private static Single single;public static Single getInstance(){if (null == single){synchronized(Single.class){if (null ==single) {return new Single();}}}return single;}}
分析:
优点:起到了懒加载的效果,且是线程安全的 在实际开发中推荐使用
静态内部类
public class Single {private Single(){}private static class SingleInstance{private final static Single single = new Single();}public static Single getInstance(){return SingleInstance.single;}}
分析:
这种方式采用了类装载机制来保证初始化实例只有一个线程,类加载时不会加载静态内部类,当首次访问时才会调用类装载机制接在静态内部类。
优点:线程安全,利用静态内部类特点实现延迟加载,效率高 推荐使用
枚举
public enum Single {SINGLE;public static Single getInstance(){return SINGLE;}}
