私はあなたが問題があることを知っているときに、正しいものから後で最適化するものから始めるべきだと思います。数ナノ秒が長すぎる場合を除き、AtomicReferenceを使用します。;マイクロ秒の第百万あると)
public static void main(String... args) {
AtomicReference<String> ars = new AtomicReference<String>();
ars.set("hello");
long start = System.nanoTime();
int runs = 1000* 1000 * 1000;
int length = test(ars, runs);
long time = System.nanoTime() - start;
System.out.printf("get() costs " + 1000*time/runs + " ps.");
}
private static int test(AtomicReference<String> ars, int runs) {
int len = 0;
for (int i = 0; i < runs; i++)
len = ars.get().length();
return len;
}
プリント
get() costs 1219 ps.
PSは、ピコ秒です。
Javaでのスレッド化は、* happen-before * relationshipsの観点から定義されています。あなたが間違っているので、キャッシュをフラッシュするという観点から考えるべきではありません。一つは、コンパイラの最適化が重要です。フラッシングキャッシュが正確なモデルであったとしても、参照されるオブジェクトが変更可能であれば、更新の順序は保証されません。 (1.5仕様までは、仕様はフラッシングキャッシュモデルを使用していましたが、実装できませんでした) –