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


Reply via email to