[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] Creation of parameterized ReferenceType not thread safe
|
This may also be related to my bug:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=309741 which is seen in
a Spring environment.
On Fri, Feb 18, 2011 at 6:55 PM, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
> 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
>