Hi, I think this is https://bugs.eclipse.org/bugs/show_bug.cgi?id=318878"Pertarget aspect instantiation is not thread-safe". Although you are using perthis, it is the same problem. The bind method generated by AJ is not synchronized. You should be getting one aspect instance. I modified AspectJ to make it synchronized and it behaves as expected - one instance. I'll see if the test suite likes the change and commit it.
cheers, Andy On 21 February 2013 10:04, Thomas Introini <int...@gmail.com> wrote: > Hello, > > I'm having some trouble understanding aspectj's behavior regarding the > "perthis" clause using threads. In particular, it seems that sometimes > aspectj, capturing a join point executed in a different thread, creates a > new aspect despite the fact that this join point refers to an object > already associated with an existing aspect. > I've created a simple program to show this particular issue i'm having. > > In Main.java i have this main method: > public static void main(String[] args) { > Foo f=new Foo(); > for(int i=0;i<5;i++){ > new Thread(f).start(); > } > > } > which creates 5 different threads, using the same Foo object. > > The Foo.java contains: > > public class Foo implements Runnable{ > public void run(){ > System.out.println("foo "+this); > } > } > > In FooA.aj i have the following aspect: > > public aspect FooA perthis(fooExc()) { > public FooA(){ > System.out.println("new aspect : "+this); > } > public pointcut fooExc():execution(void Foo.run()); > before(): fooExc(){ > System.out.println("Inside "+this); > } > } > > which should create only one aspect executing the previous main. > I'm writing this mail because i'm experiencing different results every > time i execute this sample program. > For instance, sometimes i get this results: > > new aspect : FooA@a1807c > Inside FooA@a1807c > foo Foo@fa7e74 > Inside FooA@a1807c > foo Foo@fa7e74 > Inside FooA@a1807c > foo Foo@fa7e74 > Inside FooA@a1807c > foo Foo@fa7e74 > Inside FooA@a1807c > foo Foo@fa7e74 > > Only one aspect is created since there is only one Foo object. > Sometimes the program creates an aspect for every thread: > > new aspect : FooA@a1807c > Inside FooA@a1807c > foo Foo@133796 > new aspect : FooA@82c01f > new aspect : FooA@fa7e74 > Inside FooA@fa7e74 > foo Foo@133796 > new aspect : FooA@e102dc > new aspect : FooA@183f74d > Inside FooA@183f74d > foo Foo@133796 > Inside FooA@e102dc > foo Foo@133796 > Inside FooA@82c01f > foo Foo@133796 > > as shown five aspects are created. > And some other times this happens: > > new aspect : FooA@e102dc > new aspect : FooA@82c01f > Inside FooA@e102dc > new aspect : FooA@183f74d > Inside FooA@183f74d > foo Foo@133796 > foo Foo@133796 > Inside FooA@82c01f > Inside FooA@e102dc > foo Foo@133796 > foo Foo@133796 > Inside FooA@183f74d > foo Foo@133796 > > where three different aspects are created. > I'm currently compiling and executing on Ubuntu 12.04 using aspectj 1.7.2 > and Java 6 with these commands: > ajc -cp .:./aspectjrt.jar -d ./out -sourceroots . -aspectpath . > java -cp .:../aspectjrt.jar Main > > Is the program's behavior correct creating one aspect for each thread > execution? or just one aspect is supposed to be created? > > Thanks for your time. > > Thomas. > > -- > I.T. > > _______________________________________________ > 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