Wait for lenient bean creation in non-locked threads as well
Closes gh-34349
This commit is contained in:
parent
bbb593db48
commit
dfc10c1a8d
|
@ -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();
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue