java - Thread variable after call start and run -


i realized code:

public class testthread3 extends thread {      private int i;     public void run() {          i++;     }     public static void main(string[] args) {         testthread3  = new testthread3();         a.run();         system.out.println(a.i);         a.start();         system.out.println(a.i);     } }     

results in 1 1 printed ... , don't it. haven´t found information how explain this. thanks.

results in 1 1 printed

so first a.run(); called main-thread directly calling a.run() method. increments a.i 1. call a.start(); called forks new thread. however, takes time i++; operation has not started before system.out.println(...) call made a.i still 1. if i++ has completed in a thread before println run, there nothing causes a.i field synchronized between a thread , main-thread.

if want wait spawned thread finish need a.join(); call before call println. join() method ensures memory updates done in a thread visible thread calling join. i++ update seen main-thread. use atomicinteger instead of int wraps volatile int , provides memory synchronization. however, without join() there still race condition between a thread doing increment , println.

// provides memory synchronization internal volatile int private atomicinteger i; ... public void run() {    i.incrementandget(); } ... a.start(); // still race condition here need join wait finish a.join(); system.out.println(a.i.get()); 

Comments

Popular posts from this blog

javascript - DIV "hiding" when changing dropdown value -

Does Firefox offer AppleScript support to get URL of windows? -

android - How to install packaged app on Firefox for mobile? -