Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Creation of parameterized ReferenceType not thread safe

This may also be related to my bug:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=309741 which is seen in
a Spring environment.


On Fri, Feb 18, 2011 at 6:55 PM, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
> Hi Thorsten,
>
> Looks like a bug.  Can you raise a bugzilla?  My opening position
> would be that the AspectJ weaver is a single threaded thing. But I
> know ReflectionWorlds are used in instances other than just regular
> weaving (for example, in a spring setup) - are you in Spring by any
> chance when you see this issue?
>
> cheers
> Andy
>
> On 18 February 2011 01:45, Gast, Thorsten <thorsten.gast@xxxxxxxxxxxx> wrote:
>> Hi,
>>
>> I am currently struggling with an IndexOutOfBoundsException deep in aspectj.
>>
>>        at java.util.ArrayList.add(ArrayList.java:352)
>>        at org.aspectj.weaver.ReferenceType.addDependentType(ReferenceType.java:115)
>>        at org.aspectj.weaver.ReferenceType.<init>(ReferenceType.java:95)
>>        at org.aspectj.weaver.TypeFactory.createParameterizedType(TypeFactory.java:43)
>>
>> After taking a deeper look into the code, I found out that the usage of TypeFactory.createParameterizedType() and in particular the instantiation of ReferenceType (line 43 of TypeFactory) is not thread safe. In a short program (see below) I could reproduce this issue, when passing the same instance of ResolvedType.
>>
>> Is this a bug, or should this not happen when aspectj is used in a proper way?
>>
>> Regards
>>
>> Thorsten
>>
>>
>> --- sample program start ---
>> import java.util.concurrent.CountDownLatch;
>>
>> import org.aspectj.weaver.ReferenceType;
>> import org.aspectj.weaver.ResolvedType;
>> import org.aspectj.weaver.TypeFactory;
>> import org.aspectj.weaver.World;
>> import org.aspectj.weaver.reflect.Java15ReflectionBasedReferenceTypeDelegate;
>> import org.aspectj.weaver.reflect.ReflectionWorld;
>>
>> public class Aspectj {
>>
>>    public static void main(String[] args) {
>>        new Aspectj();
>>    }
>>
>>    static World inAWorld = new ReflectionWorld(Aspectj.class.getClassLoader());
>>
>>    static ReferenceType aBaseType;
>>    static {
>>        aBaseType = new ReferenceType("test", inAWorld);
>>        Java15ReflectionBasedReferenceTypeDelegate delegate = new Java15ReflectionBasedReferenceTypeDelegate();
>>        delegate.initialize(aBaseType, String.class, Aspectj.class.getClassLoader(), inAWorld);
>>        aBaseType.setDelegate(delegate);
>>    }
>>
>>    public Aspectj() {
>>        int N = 25;
>>        CountDownLatch startSignal = new CountDownLatch(1);
>>        CountDownLatch doneSignal = new CountDownLatch(N);
>>
>>        for (int i = 0; i < N; ++i)
>>            new Thread(new Worker(startSignal, doneSignal)).start();
>>
>>        startSignal.countDown();
>>        try {
>>            doneSignal.await();
>>        } catch  (InterruptedException e){
>>            e.printStackTrace();
>>        }
>>    }
>>
>>    class Worker implements Runnable {
>>        private final CountDownLatch startSignal;
>>        private final CountDownLatch doneSignal;
>>
>>        Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
>>            this.startSignal = startSignal;
>>            this.doneSignal = doneSignal;
>>        }
>>
>>        public void run() {
>>            try {
>>                startSignal.await();
>>                doWork();
>>                doneSignal.countDown();
>>            } catch (InterruptedException ex) {
>>                ex.printStackTrace();
>>            }
>>        }
>>
>>        void doWork() {
>>            for (int i = 0; i < 10; i++) {
>>                // using TypeFactory
>>                TypeFactory.createParameterizedType(aBaseType, new ResolvedType[0], inAWorld);
>>
>>                // or creating ReferenceTypes directly
>>                //new ReferenceType(aBaseType, new ResolvedType[0], inAWorld);
>>            }
>>        }
>>    }
>>
>> }
>> --- sample program end ---
>>
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>


Back to the top