Как я могу гарантировать, что мои значения никогда не будут sh?
Если вы новичок в потоках, то я бы сказал, используйте синхронизированный блок:
final Object lock = new Object();
int global_r = 0;
...
while (true) {
int r = random.nextInt();
synchronized(lock) {
if (r > global_r) {
global_r = r;
break;
}
}
}
Только один поток одновременно может войти в блок synchronized(lock)...
. Поток, который пытается, когда другой поток уже находится в нем, будет вынужден ждать.
Всегда следует стараться, чтобы потоки проводили как можно меньше времени внутри блока synchronized(...)
, поэтому я генерирую случайное число номер за пределами блока, и выполняйте только тест и присвоение внутри него.
Другой ответ здесь предполагает, что вы используете AtomicInteger
. Это тоже работает, но это не то, что я бы порекомендовал тем, кто делает первые шаги к пониманию того, как использовать потоки.