Java线程生成相同的值

标签 java multithreading

   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/

相关文章:

java - 锁定可变对象 - 为什么它被认为是一种不好的做法?

java - 从marketdata增量刷新获取值(value)时出错

java - Xuggle 将音频与生成的音频结合起来

java - 设计实时更新的动态对象的最佳方法是什么?

java - 同时运行 2 个增强的 for 循环

java - 无法通过java连接oracle 11g

python - 下载大约 15000 个 URL 的元内容 Python - 线程

c# - 在 C# 中读写的 volatile 与互锁

linux - 调用线程构造函数时出现段错误

java - 如何将数学工作拆分为工作线程 Java