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 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


Back to the top