Я пытаюсь воспроизвести проблему видимости памяти в случае недостаточной инициализации объекта для нефинализированных полей (JLS 17.5 Final Field Semantics, FinalFieldExample). Там, где оно указано "Однако, f.y не является окончательным, поэтому метод reader() не гарантирует, что для него значение"
Я пробовал этот код:
public class ReorderingTest2 {
public static void main(String[] args) {
for (int i = 0; i < 2500; i++) {
new Thread(new Reader(i)).start();
new Thread(new Writer(i)).start();
}
}
static class Reader implements Runnable {
private String name;
Reader(int i) {
this.name = "reader" + i;
}
@Override
public void run() {
//System.out.println(name + " started");
while (true) {
FinalFieldExample.reader(name);
}
}
}
static class Writer implements Runnable {
private String name;
Writer(int i) {
this.name = "writer" + i;
}
@Override
public void run() {
//System.out.println(name + " started");
while (true) {
FinalFieldExample.writer();
}
}
}
static class FinalFieldExample {
int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader(String name) {
if (f != null) {
int i = f.x;
int j = f.y;
if (i != 3 || j != 4) {
System.out.printf("reader %s sees it!%n", name);
}
}
}
}
}
Как и в предыдущей моей схожей теме - Я пробовал на разных компьютерах (от 2 до 8 ядер) с Windows и даже на нашей серверной ОС Solaris 32 box - я не смог воспроизвести его: fx и fy - всегда уже правильно инициализированы.
Для архитектуры Intel/x86/x64 как Я получил ответ - у них довольно много default memery гарантирует, которые предотвращают переупорядочение логики конструктора. Кажется, это тоже верно для Solaris/sparc?
Итак, в какой архитектуре/ОС это переупорядочение может быть воспроизведено?