3

Josh Bloch は、ダブル チェック イディオムでローカル変数を使用してパフォーマンスを向上させる可能性について言及しており (EJ、第 2 版、p284)、サンプル コードは、ローカル変数を使用しない場合と比較して、彼のマシンで約 25% 高速に実行されると述べています。問題は、なぜ速いのかということです。ローカル変数版の場合はインスタンス変数に3回アクセスし、通常の場合はインスタンス変数に4回アクセスします。これが「25%」の増加の背後にある理由ですか、それとも他の理由がありますか?

編集: 3 回または 4 回のアクセスは、インスタンスが最初に作成されたときのみです。その後、1~2回です。

EDIT2:この質問の受け入れられた回答を確認して、コード例を確認してください。これはJava 6用だと思います。Javaで「ダブルチェックロックが壊れています」宣言を解決するにはどうすればよいですか?

4

2 に答える 2

8

基本的なことは、変数へのvolatileアクセスは、ローカル変数へのアクセスよりも遅いということです。ローカル変数を宣言すると、基本的にメソッド内で揮発性変数の値がキャッシュされます。

通常の (ローカル変数なしの) ケースでは、volatile 変数にアクセスしています。

  1. 句のif前の最初のsynchronized
  2. 節の 2 番目ifの部分synchronized
  3. if値を割り当てる秒の内側
  4. return声明では

ここで、ローカル変数を導入すると、変数にアクセスするのはvolatile3 回だけになります。

  1. 最初の句のif前にローカル変数を割り当てる場合synchronized
  2. if内の秒にローカル変数を割り当てる場合synchronized
  3. if値を割り当てる秒の内側

returnローカル変数を返すことにより、ステートメントでアクセスしないため、速度が向上します。

于 2012-06-27T08:44:01.783 に答える
1

通常の場合(すでに初期化されています) 、揮発性変数の読み取りは1つだけです(これは比較的高価です)。私はこのマシンで、これは彼が見ている削減に等しいと思います。通常のアプローチ(つまり、ローカル変数を使用しない)では、2つの読み取りがあります(1つはと用、ifもう1つはreturn。用)。

于 2012-06-27T08:57:00.640 に答える