Java线程面试题:如何在 Java 中实现线程安全的单例模式?
线程安全的单例模式可以使用双重检查锁定和静态内部类两种方式实现。
双重检查锁定
public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
在上面的例子中,volatile关键字保证了instance的修改对于其他线程的可见性。getInstace方法采用了双重检查锁定,即在保证多线程情况下只有一个对象被创建的情况下减少锁竞争,进而提高效率。在第一次获取单例对象时会通过synchronized关键字同步化整个方法,以避免对象的重复创建。
静态内部类
public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }
在这个例子中,我们使用了一个私有的静态内部类SingletonHolder来持有单例实例,在该类被加载时才会创建对象。由于这个静态内部类只会被加载一次,因此多线程环境下也能够保证只有一个对象被创建,并且不用添加同步支持,从而提高效率。
总结:线程安全的单例模式是并发编程中常见的设计模式之一。通过使用双重检查锁定或静态内部类等方式,可以确保在多线程环境下只有一个对象被创建,并尽可能减少性能和效率的损耗。需要根据具体情况选择合适的实现方式来实现线程安全的单例模式。