in org.eclipse.sisu.inject/src/org/eclipse/sisu/inject/BeanCache.java [156:197]
public BeanEntry<Q, T> remove( final Binding<T> binding )
{
LazyBeanEntry oldBean;
Object o, n;
/*
* Compare-and-swap approach; avoids locking without missing any updates
*/
do
{
o = get();
if ( null == o )
{
return null;
}
else if ( o instanceof LazyBeanEntry )
{
oldBean = (LazyBeanEntry) o;
if ( binding != oldBean.binding )
{
return null;
}
n = null; // clear single entry
}
else
{
synchronized ( this )
{
oldBean = ( (Map<?, LazyBeanEntry>) o ).remove( binding );
if ( null != oldBean )
{
mutated = true;
}
return oldBean;
}
}
}
while ( !compareAndSet( o, n ) );
return oldBean;
}