Should be reverted IMO
Le 11 mai 2013 05:21, <[email protected]> a écrit :

> Author: dblevins
> Date: Sat May 11 03:20:48 2013
> New Revision: 1481253
>
> URL: http://svn.apache.org/r1481253
> Log:
> OWB-858: AnnotatedTypeImpl not thread safe
> Fixed
>
> Modified:
>
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java
>
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/portable/AnnotatedTypeImplTest.java
>
> Modified:
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java
> URL:
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java?rev=1481253&r1=1481252&r2=1481253&view=diff
>
> ==============================================================================
> ---
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java
> (original)
> +++
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java
> Sat May 11 03:20:48 2013
> @@ -28,6 +28,10 @@ import java.util.Collections;
>  import java.util.HashSet;
>  import java.util.List;
>  import java.util.Set;
> +import java.util.concurrent.Callable;
> +import java.util.concurrent.ExecutionException;
> +import java.util.concurrent.FutureTask;
> +import java.util.concurrent.atomic.AtomicBoolean;
>
>  import javax.enterprise.inject.spi.AnnotatedConstructor;
>  import javax.enterprise.inject.spi.AnnotatedField;
> @@ -72,6 +76,19 @@ class AnnotatedTypeImpl<X>
>       */
>      private Set<AnnotatedMethod<? super X>> methods = null;
>
> +    private final AtomicBoolean notInitialized = new AtomicBoolean(true);
> +
> +    private final FutureTask initializer = new FutureTask(new Callable()
> +    {
> +        public Object call()
> +            throws Exception
> +        {
> +            init();
> +            return null;
> +        }
> +    });
> +
> +
>      /**
>       * Creates a new instance.
>       *
> @@ -192,11 +209,43 @@ class AnnotatedTypeImpl<X>
>       */
>      void addAnnotatedConstructor(AnnotatedConstructor<X> constructor)
>      {
> -        if (constructors == null)
> +        ensureInitialized();
> +        constructors.add(constructor);
> +    }
> +
> +    private void ensureInitialized()
> +    {
> +        try
>          {
> -            init();
> +            if (notInitialized.get())
> +            {
> +                do
> +                {
> +                    // If this thread is the one to set the state to
> "notInitialized=false",
> +                    // then this thread is also responsible for calling
> the initializer
> +                    if (notInitialized.compareAndSet(true, false))
> +                    {
> +                        initializer.run();
> +                    }
> +
> +                    // Try again.
> +                }
> +                while (notInitialized.get());
> +            }
> +
> +            // This is the magic blocking call that protects our read
> access
> +            // The 'get' call will not return until the initializer has
> finished running
> +            initializer.get();
> +        }
> +        catch (InterruptedException e)
> +        {
> +            Thread.interrupted();
> +            throw new IllegalStateException("Lazy Initialization of
> AnnotatedType failed.", e);
> +        }
> +        catch (ExecutionException e)
> +        {
> +            throw new IllegalStateException("Lazy Initialization of
> AnnotatedType failed.", e);
>          }
> -        constructors.add(constructor);
>      }
>
>      /**
> @@ -206,10 +255,7 @@ class AnnotatedTypeImpl<X>
>       */
>      void addAnnotatedField(AnnotatedField<? super X> field)
>      {
> -        if (constructors == null)
> -        {
> -            init();
> -        }
> +        ensureInitialized();
>          fields.add(field);
>      }
>
> @@ -220,10 +266,7 @@ class AnnotatedTypeImpl<X>
>       */
>      void addAnnotatedMethod(AnnotatedMethod<? super X> method)
>      {
> -        if (constructors == null)
> -        {
> -            init();
> -        }
> +        ensureInitialized();
>          methods.add(method);
>      }
>
> @@ -233,11 +276,7 @@ class AnnotatedTypeImpl<X>
>      @Override
>      public Set<AnnotatedConstructor<X>> getConstructors()
>      {
> -        if (constructors == null)
> -        {
> -            init();
> -        }
> -
> +        ensureInitialized();
>          return Collections.unmodifiableSet(constructors);
>      }
>
> @@ -247,11 +286,7 @@ class AnnotatedTypeImpl<X>
>      @Override
>      public Set<AnnotatedField<? super X>> getFields()
>      {
> -        if (constructors == null)
> -        {
> -            init();
> -        }
> -
> +        ensureInitialized();
>          return Collections.unmodifiableSet(fields);
>      }
>
> @@ -261,11 +296,7 @@ class AnnotatedTypeImpl<X>
>      @Override
>      public Set<AnnotatedMethod<? super X>> getMethods()
>      {
> -        if (constructors == null)
> -        {
> -            init();
> -        }
> -
> +        ensureInitialized();
>          return Collections.unmodifiableSet(methods);
>      }
>
>
> Modified:
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/portable/AnnotatedTypeImplTest.java
> URL:
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/portable/AnnotatedTypeImplTest.java?rev=1481253&r1=1481252&r2=1481253&view=diff
>
> ==============================================================================
> ---
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/portable/AnnotatedTypeImplTest.java
> (original)
> +++
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/portable/AnnotatedTypeImplTest.java
> Sat May 11 03:20:48 2013
> @@ -46,7 +46,6 @@ public class AnnotatedTypeImplTest
>      final AtomicInteger exceptions = new AtomicInteger();
>
>      @Test
> -    @Ignore
>      public void testGetFields()
>          throws Exception
>      {
> @@ -78,7 +77,6 @@ public class AnnotatedTypeImplTest
>      }
>
>      @Test
> -    @Ignore
>      public void testGetMethods()
>          throws Exception
>      {
> @@ -110,7 +108,6 @@ public class AnnotatedTypeImplTest
>      }
>
>      @Test
> -    @Ignore
>      public void testGetConstructors()
>          throws Exception
>      {
>
>
>

Reply via email to