gpt4 book ai didi

java - 了解 dagger2 ScopedProvider 中的延迟初始化单例,作者:Gregory Kick

转载 作者:行者123 更新时间:2023-11-30 02:43:26 26 4
gpt4 key购买 nike

我正在阅读Dagger2的源代码,在ScopedProvider中有静态字段UNINITIALIZED这表明 instance字段尚未初始化。我已经阅读并理解了双重检查惰性初始化习惯用法,但为什么有必要定义 UNINITIALIZED字段而不是仅仅使用 null ?与 JVM 有关吗?

/**
* A {@link Provider} implementation that memoizes the result of a {@link Factory} instance.
*
* @author Gregory Kick
* @since 2.0
*/
public final class ScopedProvider<T> implements Provider<T> {
private static final Object UNINITIALIZED = new Object();

private final Factory<T> factory;
private volatile Object instance = UNINITIALIZED;

private ScopedProvider(Factory<T> factory) {
assert factory != null;
this.factory = factory;
}

@SuppressWarnings("unchecked") // cast only happens when result comes from the factory
@Override
public T get() {
// double-check idiom from EJ2: Item 71
Object result = instance;
if (result == UNINITIALIZED) {
synchronized (this) {
result = instance;
if (result == UNINITIALIZED) {
instance = result = factory.get();
}
}
}
return (T) result;
}

/** Returns a new scoped provider for the given factory. */
public static <T> Provider<T> create(Factory<T> factory) {
if (factory == null) {
throw new NullPointerException();
}
return new ScopedProvider<T>(factory);
}
}

最佳答案

看起来这是一个惰性空安全初始化。想象一下,如果工厂返回 null,并且该代码使用 null 作为哨兵值,而不是 UNINITIALIZED。每次调用 get() 时,它都会进入同步块(synchronized block),因为它不知道 null 实际上是工厂结果,而不仅仅是未初始化的状态。

此代码允许工厂返回 null 并将结果正确地存储在 volatile 字段中,以便后续读取不会产生完全同步的开销。

关于java - 了解 dagger2 ScopedProvider 中的延迟初始化单例,作者:Gregory Kick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40943727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com