Skip to content

Commit 9bc7229

Browse files
committed
Merge branch '6.2.x'
2 parents 4d6947d + dfc10c1 commit 9bc7229

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
lines changed

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

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

Diff for: 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)