なぜ JDK ソースコードは `volatile` インスタンスの `final` コピーを取得するのか
2023-11-13 13:49:28
疑問点
JDKのソースコードで、ConcurrentHashMapについて読みました。
しかし、以下のコードで混乱しました。
public boolean isEmpty() {
final Segment<K,V>[] segments = this.segments;
...
}
私の疑問は
"this.segments"が宣言されています。
final Segment<K,V>[] segments;
つまり、ここでは、メソッドの冒頭で、同じ型の参照を宣言し、同じメモリを指すようにしました。
作者はなぜこのような書き方をしたのでしょうか?なぜthis.segmentsを直接使わなかったのでしょうか?何か理由があるのでしょうか?
どのように解決するのか?
これは、ロックフリーのコードによくあるイディオムで、次のようなものがあります。
volatile
変数を含むロックフリーのコードによく見られるイディオムです。最初の行で、あなたは
volatile
を一度読み、それからそれを使って作業をします。その間に別のスレッドが
volatile
を更新することができますが、あなたは最初に読んだ値にしか興味がありません。
また、問題のメンバ変数が volatile ではなく final である場合でも、このイディオムは CPU キャッシュと関係があり、スタックロケーションから読み込む方がランダムなヒープロケーションから読み込むよりもキャッシュに優しいからです。また、ローカル変数が CPU レジスタにバインドされて終了する可能性も高くなります。
この後者の場合、JIT コンパイラは通常それらの懸念に対処するので、実際にはいくつかの論争がありますが、Doug Lea は一般的な原則でそれに固執する人の 1 人です。
関連
-
プロジェクトの依存関係を解決できない。
-
Jsoup-Crawlingの動作
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
無効な文字定数
-
コンストラクタDate()が未定義である問題
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] Javaの "final "キーワードはどのように機能するのでしょうか?(オブジェクトを修正することは可能です。)
-
[解決済み] Java JITは、JDKのコードを実行するときに不正をするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
型に解決できない エラー解決
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
-bash: java: コマンドが見つからない 解決方法
-
Junitのユニットテストはjava.lang.Testを報告します。
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
Java基礎 - マッピングとQ/A