@ -81,7 +81,7 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
@@ -81,7 +81,7 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
private final Map < String , ObjectFactory < ? > > singletonFactories = new HashMap < > ( 16 ) ;
/** Cache of early singleton objects: bean name to bean instance. */
private final Map < String , Object > earlySingletonObjects = new HashMap < > ( 16 ) ;
private final Map < String , Object > earlySingletonObjects = new Concurrent HashMap< > ( 16 ) ;
/** Set of registered singletons, containing the bean names in registration order. */
private final Set < String > registeredSingletons = new LinkedHashSet < > ( 256 ) ;
@ -178,16 +178,24 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
@@ -178,16 +178,24 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
* /
@Nullable
protected Object getSingleton ( String beanName , boolean allowEarlyReference ) {
// Quick check for existing instance without full singleton lock
Object singletonObject = this . singletonObjects . get ( beanName ) ;
if ( singletonObject = = null & & isSingletonCurrentlyInCreation ( beanName ) ) {
synchronized ( this . singletonObjects ) {
singletonObject = this . earlySingletonObjects . get ( beanName ) ;
if ( singletonObject = = null & & allowEarlyReference ) {
ObjectFactory < ? > singletonFactory = this . singletonFactories . get ( beanName ) ;
if ( singletonFactory ! = null ) {
singletonObject = singletonFactory . getObject ( ) ;
this . earlySingletonObjects . put ( beanName , singletonObject ) ;
this . singletonFactories . remove ( beanName ) ;
singletonObject = this . earlySingletonObjects . get ( beanName ) ;
if ( singletonObject = = null & & allowEarlyReference ) {
synchronized ( this . singletonObjects ) {
// Consistent creation of early reference within full singleton lock
singletonObject = this . singletonObjects . get ( beanName ) ;
if ( singletonObject = = null ) {
singletonObject = this . earlySingletonObjects . get ( beanName ) ;
if ( singletonObject = = null ) {
ObjectFactory < ? > singletonFactory = this . singletonFactories . get ( beanName ) ;
if ( singletonFactory ! = null ) {
singletonObject = singletonFactory . getObject ( ) ;
this . earlySingletonObjects . put ( beanName , singletonObject ) ;
this . singletonFactories . remove ( beanName ) ;
}
}
}
}
}