class VisibilityProblem {
// Без 'volatile' нет гарантий, что изменение будет видно другому потоку
private boolean ready = false;
private int number = 0;
private class ReaderThread extends Thread {
@Override
public void run() {
while (!ready) { // ← Поток может никогда не увидеть изменения ready
// Пустой цикл
}
System.out.println(number); // ← Может напечатать 0, а не 42
}
}
public void start() {
new ReaderThread().start();
number = 42; // ← 1. Пишем number
ready = true; // ← 2. Пишем ready
}
} class SolvedVisibilityProblem {
// Теперь все изменения 'ready' немедленно видны всем потокам
private volatile boolean ready = false;
private int number = 0;
// ... остальной код такой же ...
} class Singleton {
// ОБЯЗАТЕЛЬНО volatile!
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) { // ← Первая проверка (без блокировки)
synchronized (Singleton.class) {
if (instance == null) { // ← Вторая проверка (с блокировкой)
instance = new Singleton(); // ← Опасная строка!
}
}
}
return instance;
}
}