ホームページ Java &#&ベース Javaにおけるvolatileの役割は何ですか

Javaにおけるvolatileの役割は何ですか

Jan 11, 2021 am 11:13 AM
java volatile

Java における volatile の役割: 1. Java は、可視性を確保するために volatile キーワードを提供します; 2. 順序性を確保するために、コードは [context =loadContext(); inited = true;]; 3. double を提供します。チェック。

Javaにおけるvolatileの役割は何ですか

このチュートリアルの動作環境: Windows7 システム、Java10 バージョン、DELL G3 コンピューターこの方法は、すべてのブランドのコンピューターに適しています。

関連する無料学習の推奨事項: Java の基本チュートリアル

Java における volatile の役割:

1. 可視性: Java は、可視性を確保するために volatile キーワードを提供します。

共有変数が volatile に変更されると、変更された値が直ちにメイン メモリに更新されます。他のスレッドがそれを読み取る必要がある場合は、メモリから新しい値を読み取ります。 . .

通常のシェア変数は変更された後、いつメイン メモリに書き込まれるかが不確実であるため、通常のシェア変数は可視性を保証できません。他のスレッドがそれを読み取るとき、メモリはまだ元の古い値である可能性があります。のため、視認性は保証されません。

さらに、synchronized と Lock によって可視性も保証できます。Synchronized と Lock を使用すると、1 つのスレッドだけが同時にロックを取得し、同期コードを実行することが保証され、変数の変更は次のようになります。ロックを解放する前にメインメモリにフラッシュされます。したがって、視認性は保証されます。

まずコードを見てみましょう。スレッド 1 が最初に実行され、スレッド 2 が後で実行される場合:

//线程1
boolean stop = false;
while(!stop){
doSomething();
}
//线程2
stop = true;
ログイン後にコピー

このコードは非常に典型的なコードです。多くの人が中断するときにこれを使用する可能性があります。スレッドのマーキング方法。しかし実際、このコードは完全に正しく実行されるでしょうか?つまり、スレッドは中断されますか?必ずしもそうとは限りませんが、ほとんどの場合、このコードはスレッドを中断する可能性がありますが、スレッドを中断できなくなる可能性もあります (この可能性は非常に低いですが、一度これが発生すると、無限ループが発生します)。

このコードによりスレッドが中断できなくなる理由を以下に説明します。前に説明したように、各スレッドは実行中に独自の作業メモリを持っているため、スレッド 1 の実行中に stop 変数の値をコピーし、それを独自の作業メモリに置きます。

次に、スレッド 2 が stop 変数の値を変更すると、それをメイン メモリに書き込む前に、スレッド 2 が他の処理に切り替わり、スレッド 1 は stop 変数の変更を知りません。スレッド 2 によって変数が変更されるため、サイクルは継続します。

しかし、volatile 変更を使用した後は、状況が異なります:

まず、volatile キーワードを使用すると、変更された値が直ちにメイン メモリに書き込まれます;

第 2 章: volatile キーワードが使用されている場合、スレッド 2 が変更を行うと、スレッド 1 の作業メモリ内のキャッシュ変数 stop のキャッシュ ラインが無効になります (ハードウェア層に反映される場合は、CPU の L1 またはL2 キャッシュは無効になります) );

3 番目: スレッド 1 の作業メモリ内のキャッシュ変数 stop のキャッシュ ラインが無効であるため、スレッド 1 はメイン メモリに移動して変数の値を読み取ります。また止まります。

次に、スレッド 2 が停止値を変更すると (もちろん、これには、スレッド 2 の作業メモリ内の値を変更し、変更された値をメモリに書き込むという 2 つの操作が含まれます)、作業スレッド 1 のメモリからキャッシュ変数 stop のキャッシュ ラインが無効であり、スレッド 1 がそれ​​を読み取ると、そのキャッシュ ラインが無効であることがわかり、キャッシュ ラインに対応するメイン メモリのアドレスが更新されるのを待ちます。次に、対応するメイン メモリに移動して最新の値を読み取ります。

したがって、スレッド 1 が読み取るのは最新の正しい値です。

2. 順序性を確保する

volatile boolean inited = false;
//线程1:
context = loadContext(); 
inited = true; 
//线程2:
while(!inited ){
sleep()
}
doSomethingwithconfig(context);
ログイン後にコピー

コンテキストが初期化されていることを確認します。

3、再確認してください

class Singleton{
private volatile static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if(instance==null) {
synchronized (Singleton.class) {
if(instance==null)
instance = new Singleton();
}
}
return instance;
}
}
ログイン後にコピー

以上がJavaにおけるvolatileの役割は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

See all articles