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
(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;
+ }
}