Java线程生成相同的值

Aar*_*Guo 5 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();
            }
        }
   }
Run Code Online (Sandbox Code Playgroud)

为什么它打印相同的值?

Thread-0 gene data:-751128970
Thread-1 gene data:-751128970
Run Code Online (Sandbox Code Playgroud)

Jes*_*per 1

Random是一个伪随机数生成器。它从一些种子值开始。如果没有显式指定种子,它将使用当前时间作为种子。

如果您非常快速地创建两个Random对象,它们将使用相同的种子值创建,并且它们将生成相同的随机数序列。- 编辑:K Erlandsson 是对的;这不是真的……

不要Random每次想要生成随机数时都创建一个新对象。

只有一个静态变量data,您在两个线程中都使用它。它们都将写入和读取同一个变量。

更好的版本:

public static void main(String[] args) {
    for(int i = 0; i < 2; i++) {
        new Thread(new Runnable(){
            private final Random random = new Random();

            @Override
            public void run() {
                int data = random.nextInt();
                System.out.println(Thread.currentThread().getName() + " gene data:" + data);
            }

        }).start();
    }
}
Run Code Online (Sandbox Code Playgroud)