当前位置: 首页 > 面试题库 >

Java中的惰性线程安全单例实例化模式

张浩阔
2023-03-14
问题内容

每个程序员都不容易理解惰性线程安全的单例实例,因此我想在我们的企业框架中创建一个可以完成此工作的类。

你怎么看待这件事?你看到不好的东西吗?在Apache Commons中有类似的东西吗?我怎样才能使它更好?

Supplier.java

public interface Supplier<T> {
    public T get();
}

LazyThreadSafeInstantiator.java

public class LazyThreadSafeInstantiator<T> implements Supplier<T> {
    private final Supplier<T> instanceSupplier;

    private volatile T obj;

    public LazyThreadSafeInstantiator(Supplier<T> instanceSupplier) {
        this.instanceSupplier = instanceSupplier;
    }

    @Override
    // http://en.wikipedia.org/wiki/Double-checked_locking
    public T get() {
        T result = obj;  // Wikipedia: Note the usage of the local variable result which seems unnecessary. For some versions of the Java VM, it will make the code 25% faster and for others, it won't hurt.
        if (result == null) {
            synchronized(this) {
                result = obj;
                if (result == null) {
                    result = instanceSupplier.get();
                    obj = result;
                }
            }
        }
        return result;
    }
}

用法示例:

public class Singleton1 {
    private static final Supplier<Singleton1> instanceHolder =
        new LazyThreadSafeInstantiator<Singleton1>(new Supplier<Singleton1>() {
            @Override
            public Singleton1 get() {
                return new Singleton1();
            }
        });

    public Singleton1 instance() {
        return instanceHolder.get();
    }

    private Singleton1() {
        System.out.println("Singleton1 instantiated");
    }
}

谢谢


问题答案:

惰性线程安全的单例实例对于每个编码器来说都不容易理解

不,实际上非常非常简单:

public class Singleton{
    private final static Singleton instance = new Singleton();
    private Singleton(){ ... }
    public static Singleton getInstance(){ return instance; }
}

更好的是,使其成为枚举:

public enum Singleton{
    INSTANCE;
    private Singleton(){ ... }
}

它是线程安全的,并且是惰性的(初始化发生在类加载时,并且Java不会加载类,直到它们被首次引用)。

事实是,您有99%的时间 根本不需要延迟加载 。在剩余的1%中,在0.9%中,上述内容完全是懒惰的。

您是否已经运行了探查器,并确定您的应用程序确实达到了真正需要首先进行延迟加载的0.01%?不这么认为。那么,您为什么要浪费时间炮制这些Rube
Goldbergesque令人讨厌的代码来解决一个不存在的问题?



 类似资料:
  • 本文向大家介绍Java线程安全中的单例模式,包括了Java线程安全中的单例模式的使用技巧和注意事项,需要的朋友参考一下 此种写法利用了类加载器的加载原理,每个类只会被加载一次,这样单例对象在其内部静态类被加载的时候生成,而且此过程是线程安全的。     其中method()方法封装内部单例对象的私有方法,作为对外接口使用,这样就可以如下调用     另外一种方式为采用枚举来实现。 以上就是本文的全

  • 问题内容: 有关Singletons的维基百科文章提到了一些用线程安全的方法来用Java实现结构。对于我的问题,让我们考虑具有冗长的初始化过程并且一次被多个线程访问的Singleton。 首先,这个未提及的方法是线程安全的吗?如果是的话,它在什么上进行同步? 其次,为什么以下实现线程安全且在初始化时是懒惰的?如果两个线程同时进入该方法,到底会发生什么? 最后,在第二个示例中,如果一个线程首先获取一

  • 本文向大家介绍Java 单例模式线程安全问题,包括了Java 单例模式线程安全问题的使用技巧和注意事项,需要的朋友参考一下 Java 单例模式线程安全问题 SpringIOC容器默认提供bean的访问作用域是单例模式。即在整个application生命周期中,只有一个instance。因此在多线程并发下,会有线程安全风险。我们在MVC框架下的servlet就是线程安全的。由于该servlet是在客

  • 问题内容: 我写了下面的Singleton类。我不确定这是否是线程安全的单例类吗? 谁能帮我这个?我在上述Singleton课堂上的任何想法都会有很大帮助。 更新代码: 我正在尝试将波希米亚建议纳入我的代码中。这是更新的代码,我得到了- 谁能看一下,让我知道这次是否正确? 问题答案: 但是有一个简单的技巧,可以让你的代码是线程安全的实现,并不需要同步!它称为“ 按需初始化持有人”习惯用法,它看起来

  • 本文向大家介绍详解C++实现线程安全的单例模式,包括了详解C++实现线程安全的单例模式的使用技巧和注意事项,需要的朋友参考一下 在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式。单例模式分为懒汉模式,跟饿汉模式两种。 首先给出饿汉模式的实现 正解: 在实例化m_instance 变量时,直接调用类的构造函数。顾名思义,在还未使用变量时,已经对m_instance进行赋值,就像很饥饿

  • 我在多线程环境中做的工作很少。所以,我需要知道below类的getInstance函数是否是线程安全的。这是单例类: 在getInstance函数(未注释)中,返回静态对象的引用。它需要线程安全机制吗? 在第二个getInstance(注释)中,如果singleObject为null,我们就创建对象。所以,它需要锁定机制,需要同步,对吧?