我正在阅读“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 。
你能帮我弄清楚为什么这段代码不会阻止任何东西吗?
提前感谢您的宝贵时间。