public class ThinkThreadLocal {
public static int data;
public static void main(String[] args) {
for(int i = 0; i < 2; i++) {
new Thread(new Runnable(){
@Override
public void run() {
data = new Random().nextInt();
System.out.println(Thread.currentThread().getName() + " gene data:" + data);
}
}).start();
}
}
}
为什么打印出相同的值?
Thread-0 gene data:-751128970
Thread-1 gene data:-751128970
最佳答案
这是因为在第一个线程打印任何内容之前,第二个将要执行的线程正在设置 data
的值。对您的代码进行少量修改可以很好地说明这一点:
public final class ThinkThreadLocal {
public static int data;
public static void main(String[] args) {
for (int i = 0; i < 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();
}
}
}
执行一次这个给了我:
Thread-0 temp: 709919531
Thread-1 temp: 2022218312
Thread-0 shared: 2022218312
Thread-1 shared: 2022218312
如您所见,生成的值不同(在本例中为 709919531 和 2022218312),但是 data
在打印第一个值之前被第二个值覆盖。这表明它与Random
的种子无关。
显示这一点的第二种方法是在类本身上进行同步,这(在这种情况下)将阻塞第二个执行的线程,直到第一个线程完成执行:
public final class ThinkThreadLocal {
public static int data;
public static void main(String[] args) {
for (int i = 0; i < 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();
}
}
}
这导致了
Thread-0 shared: 1811879710
Thread-1 shared: 1738616729
关于Java线程生成相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30554771/