剑指Offer(书):实现单例模式

题目:设计一个类,我们只能生成该类的一个实例。

生成一个单例模式,有下列几种常用解法。

1.双重检查锁。

  当运行在多线程环境中,此方法可以正常实现单例模式。

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

分析:

  1.将构造方法修饰为private,避免外部创建此类的实例;将instance修饰为private,避免直接引用;修饰为volatile,可以保证其可见性;

  2.getInstance方法,修饰为public static,此方法是外部唯一可以获取实例的方法。采用加锁机制保证多线程情况下的正常运行。

2.枚举

  这种方法是书《Effective Java》中的,可以避免多线程同步问题,也能防止序列化时重新创建对象问题。

public enum Singleton2 {
    instance;
    public void otherMethod() {
    }
}

3.单线程懒汉模式

  这种写法只能工作在单线程模式下。

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

4.静态内部类

public class Singleton5 {
    private static class SingletonHolder {
        private static final Singleton5 instance = new Singleton5();
    }
    private Singleton5() {
    }
    public static final Singleton5 getInsatance() {
        return SingletonHolder.instance;
    }
}

猜你喜欢

转载自www.cnblogs.com/liter7/p/9416000.html