题目:设计一个类,我们只能生成该类的一个实例。
生成一个单例模式,有下列几种常用解法。
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; } }