いくつかの記事では、volatile を使用すると Double Checked Locking の問題が修正されると書かれています。
class Foo {
private volatile Helper helper = null;
public Helper getHelper() {
if (helper == null) {
synchronized(this) {
if (helper == null)
helper = new Helper(); //Important
}
}
return helper;
}
}
しかし、ここでヘルパー フィールドに volatile を使用したとしても、これを安全なパブリケーションにするにはどうすればよいでしょうか。つまり、一貫性のないヘルパー オブジェクトを取得しないことをどのように保証できるのでしょうか?