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

Hi Thorsten,

Just to say I've committed some synchronization to alleviate this
problem.  A further thing I was concerned about was multiple threads
attempting type resolution on the same world, as that could lead to
two entries for the same type in the world (not ideal).  So I've also
put some synchronization code around resolution when it is building a
type.  All the AspectJ tests pass but I have to admit I don't have any
tests that exercise multiple threads playing around with one world.

Andy

On 19 February 2011 02:41, Thorsten Gast <gasttor@xxxxxx> wrote:
> Hi Andy,
>
> thanks for the fast reposnse. I will raise a bugzille on monday. I am within a spring context where prototype beans are loaded via an ObjectFactory bean. The exception mainly occurs on the first request after starting the server and the system is under load.
>
> Thorsten
>
> -------- Original-Nachricht --------
>> Datum: Fri, 18 Feb 2011 15:55:04 -0800
>> Von: Andy Clement <andrew.clement@xxxxxxxxx>
>> An: aspectj-users@xxxxxxxxxxx
>> Betreff: Re: [aspectj-users] Creation of parameterized ReferenceType not thread safe
>
>> 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
>
> --
> Schon gehört? GMX hat einen genialen Phishing-Filter in die
> Toolbar eingebaut! http://www.gmx.net/de/go/toolbar
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>


Back to the top