[
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