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.g...@wirecard.com> 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@eclipse.org > https://dev.eclipse.org/mailman/listinfo/aspectj-users > _______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users