Решил тут на базе задачки поэкспериментить над многопоточностью и мониторингом потоков. Написал вот такой вот код:
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("Бесконечность!");), то программа завершается корректно, с выводом всех сообщений. Что это такое и почему так происходит ? У кого какие мысли есть на этот счет ?