Java 7: ThreadLocalRandom генерирует одинаковые случайные числа - PullRequest
13 голосов
/ 21 августа 2011

Я пробую Java 7 ThreadLocalRandom и вижу, что он генерирует одинаковые случайные числа в нескольких потоках.

Вот мой код, в котором я создаю 5 потоков, и каждый поток выводит 5 случайных чисел:

//5 threads
for(int i = 0; i < 5 ; i++) {
    final Thread thread = new Thread() {
        @Override
        public void run() {
            System.out.print(Thread.currentThread().getName()+":");

            //each thread prints 5 random numbers
            for(int j = 0 ; j < 5; j++) {
                final int random = ThreadLocalRandom.current().nextInt(1,100);
                System.out.print(random + ",");
            }
            System.out.println();
        }
    };
    thread.start();
    thread.join();
}

Выход:

Thread-0:1,93,45,75,29,
Thread-1:1,93,45,75,29,
Thread-2:1,93,45,75,29,
Thread-3:1,93,45,75,29,
Thread-4:1,93,45,75,29,

Почему я получаю одинаковые случайные числа для каждого потока и для каждого выполнения программы?

Ответы [ 3 ]

11 голосов
/ 21 августа 2011

Похоже, есть открытая ошибка по этой проблеме. Смотрите здесь и здесь

5 голосов
/ 21 августа 2011

поиск в Google для «источника ThreadLocalRandom» дал мне http://www.assembla.com/code/scala-eclipse-toolchain/git/nodes/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java

длинных / коротких: он использует ThreadLocal<ThreadLocalRandom>, который вызывает конструктор no-arg для построения

, что нет-arg конструктор

/**
 * Constructor called only by localRandom.initialValue.
 * We rely on the fact that the superclass no-arg constructor
 * invokes setSeed exactly once to initialize.
 */
ThreadLocalRandom() {
    super();
}

супер-аргумент в Случайный вызывает его (long) с уникальным начальным числом

ОДНАКО, что конструктор делает

public Random(long seed) {
    this.seed = new AtomicLong(initialScramble(seed));
}

то есть не ожидаемое поведение из документации

, а ThreadLocalRandom не / не может использовать приватное seed

1 голос
/ 21 августа 2011

Не потому ли, что потоки создаются примерно в одно и то же время и, таким образом, получают одинаковое значение из таймера? У меня сложилось впечатление, что так оно и было, хотя я могу ошибаться.

...