Wait for lenient bean creation in non-locked threads as well

Closes gh-34349
This commit is contained in:
Juergen Hoeller 2025-02-12 23:06:22 +01:00
parent bbb593db48
commit dfc10c1a8d
2 changed files with 22 additions and 17 deletions

View File

@ -303,12 +303,11 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
beforeSingletonCreation(beanName); beforeSingletonCreation(beanName);
} }
catch (BeanCurrentlyInCreationException ex) { catch (BeanCurrentlyInCreationException ex) {
if (locked) {
this.lenientCreationLock.lock(); this.lenientCreationLock.lock();
try { try {
while ((singletonObject = this.singletonObjects.get(beanName)) == null) { while ((singletonObject = this.singletonObjects.get(beanName)) == null) {
if (!this.singletonsInLenientCreation.contains(beanName)) { if (!this.singletonsInLenientCreation.contains(beanName)) {
throw ex; break;
} }
try { try {
this.lenientCreationFinished.await(); this.lenientCreationFinished.await();
@ -317,11 +316,15 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
} }
return singletonObject;
} }
finally { finally {
this.lenientCreationLock.unlock(); this.lenientCreationLock.unlock();
} }
if (singletonObject != null) {
return singletonObject;
}
if (locked) {
throw ex;
} }
// Try late locking for waiting on specific bean to be finished. // Try late locking for waiting on specific bean to be finished.
this.singletonLock.lock(); this.singletonLock.lock();

View File

@ -102,6 +102,8 @@ class BackgroundBootstrapTests {
@Bean @Bean
public TestBean testBean1(ObjectProvider<TestBean> testBean3, ObjectProvider<TestBean> testBean4) { public TestBean testBean1(ObjectProvider<TestBean> testBean3, ObjectProvider<TestBean> testBean4) {
new Thread(testBean3::getObject).start();
new Thread(testBean4::getObject).start();
new Thread(testBean3::getObject).start(); new Thread(testBean3::getObject).start();
new Thread(testBean4::getObject).start(); new Thread(testBean4::getObject).start();
try { try {