diff --git a/java/dagger/internal/DoubleCheck.java b/java/dagger/internal/DoubleCheck.java index af7d7f69a14..b27a71f0566 100644 --- a/java/dagger/internal/DoubleCheck.java +++ b/java/dagger/internal/DoubleCheck.java @@ -19,6 +19,8 @@ import static dagger.internal.Preconditions.checkNotNull; import dagger.Lazy; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import javax.inject.Provider; /** @@ -31,6 +33,8 @@ public final class DoubleCheck implements Provider, Lazy { private volatile Provider provider; private volatile Object instance = UNINITIALIZED; + private final Lock lock = new ReentrantLock(); + private DoubleCheck(Provider provider) { assert provider != null; this.provider = provider; @@ -41,7 +45,8 @@ private DoubleCheck(Provider provider) { public T get() { Object result = instance; if (result == UNINITIALIZED) { - synchronized (this) { + lock.lock(); + try { result = instance; if (result == UNINITIALIZED) { result = provider.get(); @@ -50,6 +55,8 @@ public T get() { * can make it eligible for GC. */ provider = null; } + } finally { + lock.unlock(); } } return (T) result; @@ -99,4 +106,4 @@ public static

, T> Lazy lazy(P provider) { } return new DoubleCheck(checkNotNull(provider)); } -} +} \ No newline at end of file