ThreadLocalRandom, генерация nextDouble(double, double)

204
20 июля 2021, 03:50

Всем доброго времени суток. Вопрос заключается в следующем: почему при объявлении в классе

private static Random random = ThreadLocalRandom.current();

в методе следующего вида

public static double getPositiveDoubleRandomValue(double first, double second) {
    return random.nextDouble(first, second);
}

компилятор не предлагает использовать метод nextDouble(double, double), а единственно возможный вариант для использования - nextDouble()? Но в то же время, если реализацию метода изменить на

public static double getPositiveDoubleRandomValue(double first, double second) {
    return ThreadLocalRandom.current().nextDouble(first, second);
}

то все нормально работает. Спасибо!

Answer 1

В данном случае статическое поле Random random Инициализируется один раз каким-то потоком и все потоки которые будут далее обращаться к нему через метод getPositiveDoubleRandomValue будут использовать именно этот экземпляр объекта. В то время как идея ThreadLocal заключается в том что у каждого потока будет своя копия объекта Random и чтобы несколько потоков одновременно не полезли в один и тот же Random.

Во втором же варианте, поток, зайдя в метод, запросит свою копию Random, что позволит не допустить одновременного доступа двух потоко к одному объекту.

Intellij предупреждает вас что код получается не "Thread safe". Читайте "Не безопасным" и возможны очень странные ошибки и непредсказуемое поведение, если не исправить.

READ ALSO
Как работает Scanner.tokens()

Как работает Scanner.tokens()

В документации к класу Scanner написано, что tokens() возвращает стрим стрингов, таких же которые возвращал бы метод next()

197
Оператор break для switch case внутри lambda-выражения

Оператор break для switch case внутри lambda-выражения

Прошу подсказать, как можно обыграть такую ситуацию с break:

177
Enum и константы в чем отличие?

Enum и константы в чем отличие?

Старый способ имитации "перечисления":

281
Убрать фон кнопки в Swing

Убрать фон кнопки в Swing

Как убрать фон кнопки так, чтобы осталось только одно изображение? Сама иконка 16x16

161