Решил тут на базе задачки поэкспериментить над многопоточностью и мониторингом потоков. Написал вот такой вот код:
public class Test {
public static void main(String[] args) {
Runnable r = () -> IMF.getFund();
Thread thread = new Thread(r);
Thread thread1 = new Thread(r);
thread.start();
while (true) {
//System.out.println("Бесконечность!");
if (IMF.imf != null) {
System.out.println("Состояние первого потока - " + thread.getState());
System.out.println("Состояние второго потока - " + thread1.getState());
System.out.println(IMF.imf);
break;
}
}
}
static class IMF {
static String imf;
static String getFund() {
imf = Math.random() * 1000 + " Это поток - " + Thread.currentThread().getName();
return imf;
}
}
}
И обнаружил вот такой вот интересный прикол 🤓
В цикле я мониторю состояние переменной imf и когда она изменится вывожу сообщения. При таком исполнении программа попадает в некоторое состояние бесконечности и ничего не выводит в консоль (хотя дебаггером все завершается корректно).
Однако, если в цикл я добавляю наблюдателя (System.out.println("Бесконечность!");), то программа завершается корректно, с выводом всех сообщений.
Что это такое и почему так происходит ?
У кого какие мысли есть на этот счет ?