這兩個班是一樣的嗎?是否正在實例化非最終靜態變量線程安全?
public class SingleTone {
// yes this is a bug what if i change the class this way
// private static SingleTone instance = new SingleTone();
// and empty constructor?
private static SingleTone instance;
private SingleTone() {
instance = new SingleTone();
}
public static SingleTone getInstance(){
return instance;
}
}
和
public class SingleTone {
private final static SingleTone instance = new SingleTone();
private SingleTone() {
}
public static SingleTone getInstance(){
return instance;
}
}
是在有最終沒有任何變化線程安全問題,通過構造函數實例?
問題2:
什麼
private final static SingleTone instance = new SingleTone();
private SingleTone() {
}
,這之間的差異:
private final static SingleTone instance;
private SingleTone() {
instance = new SingleTone();
}
爲了澄清更多:如果我這樣重寫我的第一個例子私有靜態SingleTone實例=新SingleTone();並刪除構造函數實例!什麼是使用最終的好處! (我正在尋求線程安全問題而不是性能) – 2013-03-18 12:17:08
您問題的原始版本的兩個部分都包含錯誤。而你的「澄清」問題現在如此令人困惑/混亂,以至於無法迴避......國際海事組織。 – 2013-03-18 12:18:01
可以回答的一點是:有或沒有'最終'字段*有效最終*,因爲它被保證只能分配一次。它是線程安全的,因爲分配發生在類初始化時。 – 2013-03-18 12:19:55