#1663·guice

Deadlock in multi-threading enviroment (Guice 5.1)

Author: salacrCreated Jan 23, 2023Updated May 21, 2026

It seems that there might be a deadlock in an environment when multiple binding types (JIT / Constructor / Member) are mixed We have found these thread dumps: First:

qtp558569884-17964
	at [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
	at [email protected]/java.util.concurrent.locks.LockSupport.park(LockSupport.java:211)
	at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:523)
	at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:90)
	at com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly(Uninterruptibles.java:199)
	at com.google.common.cache.LocalCache$LoadingValueReference.waitForValue(LocalCache.java:3581)
	at com.google.common.cache.LocalCache$Segment.waitForLoadingValue(LocalCache.java:2174)
	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2038)
	at com.google.common.cache.LocalCache.get(LocalCache.java:3952)
	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
	at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4958)
	at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4964)
	at com.google.inject.internal.FailableCache.get(FailableCache.java:54)
	at com.google.inject.internal.MembersInjectorStore.get(MembersInjectorStore.java:69)
	at com.google.inject.internal.ConstructorInjectorStore.createConstructor(ConstructorInjectorStore.java:75)
	at com.google.inject.internal.ConstructorInjectorStore.access$000(ConstructorInjectorStore.java:30)
	at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:38)
	at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:34)
	at com.google.inject.internal.FailableCache$1.load(FailableCache.java:43)
	at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3528)
	at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2277)
	at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154)
	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2044)
	at com.google.common.cache.LocalCache.get(LocalCache.java:3952)
	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
	at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4958)
	at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4964)
	at com.google.inject.internal.FailableCache.get(FailableCache.java:54)
	at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:49)
	at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:152)
	at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:605)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:943)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:863)
	at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:300)
	at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:223)
	at com.google.inject.internal.InjectorImpl.getProviderOrThrow(InjectorImpl.java:1093)
	at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1122)
	at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1087)
	at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1139)
	.....

and second:

	at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:265)
	at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:223)
	at com.google.inject.internal.SingleFieldInjector.<init>(SingleFieldInjector.java:39)
	at com.google.inject.internal.MembersInjectorStore.getInjectors(MembersInjectorStore.java:131)
	at com.google.inject.internal.MembersInjectorStore.createWithListeners(MembersInjectorStore.java:97)
	at com.google.inject.internal.MembersInjectorStore.access$000(MembersInjectorStore.java:40)
	at com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:49)
	at com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:45)
	at com.google.inject.internal.FailableCache$1.load(FailableCache.java:43)
	at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3528)
	at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2277)
	at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154)
	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2044)
	at com.google.common.cache.LocalCache.get(LocalCache.java:3952)
	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
	at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4958)
	at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4964)
	at com.google.inject.internal.FailableCache.get(FailableCache.java:54)
	at com.google.inject.internal.MembersInjectorStore.get(MembersInjectorStore.java:69)
	at com.google.inject.internal.InjectorImpl.getMembersInjector(InjectorImpl.java:1072)
	at com.google.inject.internal.InjectorImpl.getMembersInjector(InjectorImpl.java:1082)
	at com.google.inject.internal.InjectorImpl.injectMembers(InjectorImpl.java:1061)

Unfortunately, our setup is quite huge.. thousands of bindings and quite often we are obtaining instances directly from injector. (we are in a process of transformation to proper DI). So I can't provide you with more details now. I'm trying to create minimal test case for now without luck