Hi folks! since this is pretty heavy stuff, I'd be happy if someone could review my changes.
txs and LieGrue, strub ----- Original Message ---- > From: "[email protected]" <[email protected]> > To: [email protected] > Sent: Thu, August 12, 2010 12:51:26 AM > Subject: svn commit: r984612 - in >/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context: >AbstractContext.java creational/BeanInstanceBag.java > > Author: struberg > Date: Wed Aug 11 22:51:26 2010 > New Revision: 984612 > > URL: http://svn.apache.org/viewvc?rev=984612&view=rev > Log: > OWB-437 improve synchronization block for creating new contextual instances > > by moving it to the ContextualBeanBag. This way only the beanbag will get > locked and not the whole container anymore > > Modified: > >openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/AbstractContext.java > > >openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java > > > Modified: >openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/AbstractContext.java > > URL: : >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/AbstractContext.java?rev=984612&r1=984611&r2=984612&view=diff > > ============================================================================== > --- >openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/AbstractContext.java > a (original) > +++ >openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/AbstractContext.java > Wed Aug 11 22:51:26 2010 > @@ -195,7 +195,7 @@ public abstract class AbstractContext im > * {...@inheritdoc} > */ > @SuppressWarnings("unchecked") > - protected synchronized <T> T getInstance(Contextual<T> contextual, >CreationalContext<T> creationalContext) > + protected <T> T getInstance(Contextual<T> contextual, >CreationalContext<T> creationalContext) > { > T instance = null; > > @@ -205,9 +205,11 @@ public abstract class AbstractContext im > { > createContextualBag(contextual, creationalContext); > } > - > + > + bag = (BeanInstanceBag<T>)componentInstanceMap.get(contextual); > + > //Look for instance > - instance = >(T)componentInstanceMap.get(contextual).getBeanInstance(); > > + instance = bag.getBeanInstance(); > if (instance != null) > { > return instance; > @@ -225,16 +227,8 @@ public abstract class AbstractContext im > //No instance > if(instance == null) > { > - instance = contextual.create(creationalContext); > - } > - > - //If succesfull creation > - if (instance != null) > - { > - bag = >(BeanInstanceBag<T>)this.componentInstanceMap.get(contextual); > - bag.setBeanInstance(instance); > + instance = bag.create(contextual); > } > - > } > } > > > Modified: >openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java > > URL: >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java?rev=984612&r1=984611&r2=984612&view=diff > > ============================================================================== > --- - >openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java > (original) > +++ >openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java > Wed Aug 11 22:51:26 2010 > @@ -18,6 +18,7 @@ > */ > package org.apache.webbeans.context.creational; > > +import javax.enterprise.context.spi.Contextual; > import javax.enterprise.context.spi.CreationalContext; > import java.io.Serializable; > > @@ -25,7 +26,7 @@ public class BeanInstanceBag<T> implemen > { > private final CreationalContext<T> beanCreationalContext; > > - private volatile T beanInstance; > + private T beanInstance; > > public BeanInstanceBag(CreationalContext<T> beanCreationalContext) > { > @@ -58,4 +59,19 @@ public class BeanInstanceBag<T> implemen > return beanInstance; > } > > + /** > + * Create the contextual instance in a thread safe fashion > + * @param contextual > + * @return the single contextual instance for the context > + */ > + public synchronized T create(Contextual<T> contextual) > + { > + // we need to check again, maybe we got blocked by a previous >invocation > + if (beanInstance == null) > + { > + beanInstance = contextual.create(beanCreationalContext); > + } > + > + return beanInstance; > + } > } > > >
