誰もこの例が揮発性のないスレッドセーフである理由を説明できますか? computeHashCode関数は常に同じ結果を返し、副作用なし(すなわち、冪等)を有していたと仮定して実際にスレッドセーフ(揮発性なし)
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
、あなたも、同期のすべてを取り除くことができます。
// Lazy initialization 32-bit primitives
// Thread-safe if computeHashCode is idempotent
class Foo {
private int cachedHashCode = 0;
public int hashCode() {
int h = cachedHashCode;
if (h == 0) {
h = computeHashCode();
cachedHashCode = h;
}
return h;
}
// other functions and members...
}
MORE:値は(それが本当にスレッドセーフではありません)を2回に計算されている場合、私はそれを得るには、我々は気にしないでください。私はまた、ハッシュコードの計算後に作成された新しいスレッドが新しいハッシュコードを見ることが保証されているかどうかを知りたいですか?
おそらく、同期化または揮発性を使用せずに何が起こるのかを検討すると、その理由がわかります。 –
'Foo'は事実上不変であることが重要であることに注意してください。これは、 'hashCode()'が冪等であることを保証します。 – Kevin