我碰到過的SCJP練習題之一就是在SafeDeposit類中提供了代碼。該問題的答案聲稱,如果另一個類使用多個線程,那麼非同步(非線程安全)getInstance()方法可能返回多個SafeDeposit實例。我試過了,試過了,不能得到toString()方法來表明有多個SafeDeposit實例被創建。我是否錯過了一些東西,或者這只是「可能」發生的事情之一,但確實真的不太可能發生?如何使公共靜態非同步getInstance()方法將一個私有靜態引用變量的多個實例返回給一個對象?
class SafeDeposit {
private static SafeDeposit sd;
public static SafeDeposit getInstance() {
if(sd == null) sd = new SafeDeposit();
return sd;
}
private SafeDeposit() { }
}
public class PrivCon {
public static void main(String[] args) {
String checker;
SafeThief wizard = new SafeThief();
SafeThief wizard2 = new SafeThief();
for(int i = 0; i < 10; i ++) {
new Thread(wizard).start();
new Thread(wizard2).start();
}
}
}
class SafeThief implements Runnable {
public void run() {
System.out.println(SafeDeposit.getInstance().toString());
}
}
謝謝,這真的有幫助。我從來沒有見過像你的熱身代碼。我很想看看如何實現這樣的效果會影響我的其他多線程練習。 – paniclater
它絕對會影響所有嘗試檢測寫入可見性問題的練習。但是,請注意,這段代碼非常脆弱,我甚至開始想知道爲什麼它的工作「很好」:'println'是一個同步方法,所以一旦你調用它,你的線程就會同步* all * its記憶與系統的其餘部分。 –