Skip to content

Commit dfc10c1

Browse files
committed
Wait for lenient bean creation in non-locked threads as well
Closes gh-34349
1 parent bbb593d commit dfc10c1

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java

+20-17
Original file line numberDiff line numberDiff line change
@@ -303,26 +303,29 @@ public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
303303
beforeSingletonCreation(beanName);
304304
}
305305
catch (BeanCurrentlyInCreationException ex) {
306-
if (locked) {
307-
this.lenientCreationLock.lock();
308-
try {
309-
while ((singletonObject = this.singletonObjects.get(beanName)) == null) {
310-
if (!this.singletonsInLenientCreation.contains(beanName)) {
311-
throw ex;
312-
}
313-
try {
314-
this.lenientCreationFinished.await();
315-
}
316-
catch (InterruptedException ie) {
317-
Thread.currentThread().interrupt();
318-
}
306+
this.lenientCreationLock.lock();
307+
try {
308+
while ((singletonObject = this.singletonObjects.get(beanName)) == null) {
309+
if (!this.singletonsInLenientCreation.contains(beanName)) {
310+
break;
311+
}
312+
try {
313+
this.lenientCreationFinished.await();
314+
}
315+
catch (InterruptedException ie) {
316+
Thread.currentThread().interrupt();
319317
}
320-
return singletonObject;
321-
}
322-
finally {
323-
this.lenientCreationLock.unlock();
324318
}
325319
}
320+
finally {
321+
this.lenientCreationLock.unlock();
322+
}
323+
if (singletonObject != null) {
324+
return singletonObject;
325+
}
326+
if (locked) {
327+
throw ex;
328+
}
326329
// Try late locking for waiting on specific bean to be finished.
327330
this.singletonLock.lock();
328331
locked = true;

spring-context/src/test/java/org/springframework/context/annotation/BackgroundBootstrapTests.java

+2
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ static class UnmanagedThreadsBeanConfig {
102102

103103
@Bean
104104
public TestBean testBean1(ObjectProvider<TestBean> testBean3, ObjectProvider<TestBean> testBean4) {
105+
new Thread(testBean3::getObject).start();
106+
new Thread(testBean4::getObject).start();
105107
new Thread(testBean3::getObject).start();
106108
new Thread(testBean4::getObject).start();
107109
try {

0 commit comments

Comments
 (0)