multithreading - Java thread generate same value -


   public class thinkthreadlocal {          public static int data;          public static void main(string[] args) {             for(int = 0; < 2; i++) {                 new thread(new runnable(){                      @override                     public void run() {                         data = new random().nextint();                         system.out.println(thread.currentthread().getname() + " gene data:" + data);                     }                  }).start();             }         }    } 

why prints same value?

thread-0 gene data:-751128970 thread-1 gene data:-751128970 

it's because thread executed second setting value of data before first thread printing anything. making minor modification code illustrates quite well:

public final class thinkthreadlocal {      public static int data;      public static void main(string[] args) {         (int = 0; < 2; i++) {             new thread(new runnable() {                  @override                 public void run() {                     int temp = data = new random().nextint();                     system.out.println(thread.currentthread().getname() + " temp: " + temp);                     system.out.println(thread.currentthread().getname() + " shared: " + data);                 }              }).start();         }     } } 

one execution of gave me:

thread-0 temp: 709919531 thread-1 temp: 2022218312 thread-0 shared: 2022218312 thread-1 shared: 2022218312 

as can see, values being generated different (709919531 , 2022218312 in case), data being overwritten second value before first value printed. shows unrelated seed of random.

a second way show synchronize on class itself, (in case) block thread gets executed second until first has finished executing:

public final class thinkthreadlocal {      public static int data;      public static void main(string[] args) {         (int = 0; < 2; i++) {             new thread(new runnable() {                  @override                 public void run() {                     synchronized (thinkthreadlocal.class) {                         data = new random().nextint();                         system.out.println(thread.currentthread().getname() + " shared: " + data);                     }                 }              }).start();         }     }  } 

which resulted in

thread-0 shared: 1811879710 thread-1 shared: 1738616729 

Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

php - CakePHP HttpSockets send array of paramms -

node.js - Using Node without global install -