指的這個https://en.wikipedia.org/wiki/Double-checked_locking, 我們:爲什麼在雙重檢查鎖定中添加第二個測試?
// "Double-Checked Locking" idiom
class Foo {
private Helper helper;
public Helper getHelper() {
if (helper == null) {
synchronized(this) {
if (helper == null) {
helper = new Helper();
}
}
}
return helper;
}
// other functions and members...
}
什麼是第二次測試的目的是什麼? 2個線程是否可以同時訪問同一臨界區?
OK now i得到它,謝謝你,你很清楚 –
只是爲了避免有人簡單地複製OP的代碼:它是**不是100%正確**,[wiki](https://en.wikipedia.org/ wiki/Double-checked_locking)表示您必須將變量聲明爲volatile,或者使用[按需求持有人慣用法初始化](https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom)或包裝器。 – beosign
@jameslarge:你的論點的問題是,在線程B可見對象的字段之前,線程B可以看到變量'helper' - 因爲沒有發生 - 在涉及關係之前。因此'volatile'限定符*是必需的。 – Nayuki