设计模式-单例模式

2019-04-09  本文已影响0人  liuzhimi

介绍

单例模式确保某一个类只有一个实例,而且自行实例化。
主要解决:一个全局使用的类频繁地创建与销毁。
使用场景:需要控制实例数目并且节省系统资源的时候。
优点


UML类图

实现单例模式关键点


代码实现

以下实现均线程安全。

饿汉式

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

优点:没有加锁,效率会提高
缺点:类加载时就初始化,浪费内存;

懒汉式

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

优点:懒汉模式在第一次调用才初始化,避免了内存浪费。
缺点:使用synchronized关键字添加了方法锁,每次调用getInstance()方法都会进行同步,降低了效率;

DCL(Double Check Lock)

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

优点:能够在需要时才初始化单例;线程安全且初始化后再调用getInstance()方法不进行同步锁。
缺点:第一次加载时稍慢。

静态内部类

public class SingleObject {
    private SingleObject() {}
    
    public static SingleObject getInstance() {
        return SingleHolder.sIntance;
    }
    
    private static class SingleHolder {
        private static final SingleObject sIntance = new SingleObject();
    }
}

只有再第一次调用getInstance()方法时才会导致sIntance被初始化。
原理:利用classloader机制来保证初始化instance只有一个线程。

枚举

public enum SingleObject {
    INSTANCE;
    public void method() {}
}

枚举实例的创建线程安全的,并且即使反序列化也不会重新生成新的实例。

上一篇 下一篇

猜你喜欢

热点阅读