我正在阅读“Java Concurrency in practice”并查看第51页的示例代码.
这表明如果一个线程具有对共享对象的引用,那么其他线程可能能够在构造函数完成执行之前访问该对象.
我试图将其付诸实践,因此我编写了这段代码,认为如果我运行足够多次RuntimeException(“World is f * cked”)就会发生.但事实并非如此.
这是Java规范的一个案例,不保证某些东西,但我特定的java实现保证了它吗? (java版本:Ubuntu上的1.5.0)或者我误读了书中的内容?
代码:(我期待一个例外,但它永远不会被抛出)
public class Threads {
private Widgit w;
public static void main(String[] s) throws Exception {
while(true){
Threads t = new Threads();
t.runThreads();
}
}
private void runThreads() throws Exception{
new Checker().start();
w = new Widgit((int)(Math.random() * 100) + 1);
}
private class Checker extends Thread{
private static final int LOOP_TIMES = 1000;
public void run() {
int count = 0;
for(int i = 0; i < LOOP_TIMES; i++){
try {
w.checkMe();
count++;
} catch(NullPointerException npe){
//ignore
}
}
System.out.println("checked: "+count+" times out of "+LOOP_TIMES);
}
}
private static class Widgit{
private int n;
private int n2;
Widgit(int n) throws InterruptedException{
this.n = n;
Thread.sleep(2);
this.n2 = n;
}
void checkMe(){
if (n != n2) {
throw new RuntimeException("World is f*cked");
}
}
}
}