Пусть имеем на исполнении следующий код:
package attempt;
import java.util.concurrent.*;
class Writer implements Runnable {
public void run() {
Main.x = 1;
// Main.secret();
}
}
class Reader implements Runnable {
public void run() {
// Main.secret();
System.out.println(Main.x);
}
}
public class Main {
public static int x = 0;
public static synchronized void secret() {
int unused = 5;
}
public static void main(String[] args){
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(new Writer());
exec.execute(new Reader());
exec.shutdown();
}
}
Можно смело заявить, что для данной программы нет никакой гарантии увидеть на выходе единицу, ведь поток Reader'а не обязательно видит сделанные потоком Writer'а действия (см. кэши процессоров).
Вопрос: правда ли, что если раскомментировать все комментарии программы, образуется 100%-ая гарантия того, что на выходе программы будет единица?
Другими словами: Точно ли будет так?
Main.x = 1;
<< // внутри одного потока
Main.secret(); // writer's thread
<< // между освобождением и захватом той же блокировки
Main.secret(); // reader's thread
<< // внутри одного потока
System.out.println(Main.x);
,где "<<" - happens-before.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей