Всем доброго времени суток. Вопрос заключается в следующем: почему при объявлении в классе
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);
}
то все нормально работает. Спасибо!
В данном случае статическое поле Random random Инициализируется один раз каким-то потоком и все потоки которые будут далее обращаться к нему через метод getPositiveDoubleRandomValue будут использовать именно этот экземпляр объекта. В то время как идея ThreadLocal заключается в том что у каждого потока будет своя копия объекта Random и чтобы несколько потоков одновременно не полезли в один и тот же Random.
Во втором же варианте, поток, зайдя в метод, запросит свою копию Random, что позволит не допустить одновременного доступа двух потоко к одному объекту.
Intellij предупреждает вас что код получается не "Thread safe". Читайте "Не безопасным" и возможны очень странные ошибки и непредсказуемое поведение, если не исправить.