Я читаю «Java Concurrency in Practice» и пытаюсь написать фрагмент кода, который покажет, что класс, представленный в качестве примера в главе 3.5.1, может действительно ввести проблемы.Кодирование доказательства потенциальной проблемы параллелизма
public class Holder {
public int n;
public Holder(int n) {
this.n = n;
}
public void assertSanity() {
if (n != n) {
throw new AssertionError("sanity check failed!!");
}
}
}
Он сказал, что если используется следующим образом (я считаю, что это о том, что поле является общедоступным, проблема параллелизма может произойти.
public Holder holder;
public void initialize() {
holder = new Holder(42);
}
Так что я придумал этот код, чтобы увидеть, если что-то плохое случится.
public class SanityCheck {
public Holder holder;
public static void main(String[] args) {
SanityCheck sanityCheck = new SanityCheck();
sanityCheck.runTest();
}
public void runTest() {
for (int i = 0; i < 100; i++) {
new Thread() {
@Override
public void run() {
while (true) {
if (holder != null) {
holder.assertSanity();
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
}
}
}.start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
initialize();
}
public void initialize() {
holder = new Holder(42);
}
}
Но ничего плохого не происходит, никакой AssertionError не было выброшено.
Не могли бы вы помочь мне разобраться, почему этот код ничего не тормозит?
Заранее благодарю вас за ваше время.
Я согласен, попробовать его на старом многоядерного процессора ARM и может сломаться. –