Если случайно выбрасывать в интервале 1..5, то первый поток успевает всё сделать ещё до того, как второй начнёт. Вот если выбрасывать в интервале 1..5000, то тогда шансы и второго появляются
import java.util.concurrent.atomic.*;
import java.util.*;
public class Program
{
public static void main(String[] args) throws Exception {
var LUCKY_NUMBER = 5;
var MAX_NUMBER = 5000;
var value = new AtomicInteger();
var rnd = new Random();
var luckyThread = new AtomicReference();
var runnable = (Runnable) () -> {
while (true) {
var new_v = rnd.nextInt(MAX_NUMBER)+1;
var old_v = value.getAndSet(new_v);
if (new_v == LUCKY_NUMBER && old_v != LUCKY_NUMBER) {
luckyThread.set(Thread.currentThread().getName());
break;
} else if (old_v == LUCKY_NUMBER) {
break;
}
}
};
var t1 = new Thread(runnable);
var t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Lucky thread is "+ luckyThread.get());
}
}