测试最终字段的初始化安全性
2022-09-01 12:11:47
我试图简单地测试JLS保证的最终字段的初始化安全性。这是为了我正在写的一篇论文。但是,我无法根据我当前的代码让它“失败”。有人能告诉我我做错了什么吗,或者如果这只是我必须一遍又一遍地跑,然后看到一些不幸的时机失败?
这是我的代码:
public class TestClass {
final int x;
int y;
static TestClass f;
public TestClass() {
x = 3;
y = 4;
}
static void writer() {
TestClass.f = new TestClass();
}
static void reader() {
if (TestClass.f != null) {
int i = TestClass.f.x; // guaranteed to see 3
int j = TestClass.f.y; // could see 0
System.out.println("i = " + i);
System.out.println("j = " + j);
}
}
}
我的线程是这样称呼它的:
public class TestClient {
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
Thread writer = new Thread(new Runnable() {
@Override
public void run() {
TestClass.writer();
}
});
writer.start();
}
for (int i = 0; i < 10000; i++) {
Thread reader = new Thread(new Runnable() {
@Override
public void run() {
TestClass.reader();
}
});
reader.start();
}
}
}
我已经运行过很多很多次这个场景。我当前的循环生成了 10,000 个线程,但我已经使用了 1000、100000 甚至 100 万个线程。仍然没有失败。我总是看到3和4的两个值。我怎样才能让它失败?