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 <[email protected]> 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 <[email protected]> >> An: [email protected] >> 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 <[email protected]> >> 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 >> > [email protected] >> > https://dev.eclipse.org/mailman/listinfo/aspectj-users >> > >> _______________________________________________ >> aspectj-users mailing list >> [email protected] >> 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 > [email protected] > https://dev.eclipse.org/mailman/listinfo/aspectj-users > _______________________________________________ aspectj-users mailing list [email protected] https://dev.eclipse.org/mailman/listinfo/aspectj-users
