ホームページ Java &#&チュートリアル cas 命令のロックフリー プログラミングを実装する Java の例

cas 命令のロックフリー プログラミングを実装する Java の例

Sep 15, 2017 am 11:07 AM
java プログラミング

この記事では主に Java 言語での cas 命令のロックフリープログラミングの実装例を紹介します。必要な方はそれについて学ぶことができます。

関連コンテンツに初めて触れるときは、volatile キーワードを使用する必要があります。これにより、変数の可視性が保証され、読み取りと書き込みのアトミック操作の実装に使用できることがわかります。 。 。しかし、一部の複合操作を volatile で実装することは無力です。 。 。最も典型的なのはインクリメント演算とデクリメント演算です。 。 。 。

同時環境では、データの一貫性を達成する最も簡単な方法は、同時に 1 つのスレッドだけがデータを操作できるようにロックすることであることがわかっています。 。 。 。たとえば、カウンターは次の方法で実装できます:


public class Counter {
  private volatile int a = 0;
  public synchronized int incrAndGet(int number) {
    this.a += number;
    return a;
  } 
  public synchronized int get() {
    return a;
  }
}
ログイン後にコピー

属性 a への同期アクセスを保証するために、すべての操作を synchronized キーワードで変更します。 。 。これにより、確かに同時環境での一貫性を確保できますが、ロック、ロック オーバーヘッド、スレッド スケジューリングなどの使用により、プログラムのスケーラビリティが制限されるため、ロックを使用しない実装が多くあります。 。 。 。

実際、これらのロックフリーのメソッドはすべて、プロセッサによって提供されるいくつかの CAS (比較および切り替え) 命令を使用します。この CAS は具体的に何を行うのでしょうか? 次のメソッドを使用して、CAS によって表されるセマンティクスを説明できます。

public synchronized int compareAndSwap(int expect, int newValue) {
    int old = this.a;
    if (old == expect) {
      this.a = newValue;
    }
    return old;
  }
ログイン後にコピー

さて、コードを通して CAS のセマンティクスについてよく理解してください。現在、ほとんどのプロセッサがアトミック CAS 命令を実装しているようです。 。
さて、Java で CAS が使用される場所を見てみましょう。まず、AtomicInteger 型を見てみましょう。これは同時実行ライブラリで提供される型です。これは内部定義であり、使用される属性です。値を保存するため、揮発性型であるため、スレッド間の可視性と読み書きのアトミック性を確保できます。 。 。

次に、より一般的に使用されるメソッドをいくつか見てみましょう:


private volatile int value;
ログイン後にコピー

このメソッドの機能は、現在の値にデルタを追加することです。ここでは、メソッド全体にロックがないことがわかります。実際にコード Javaでロックフリーカウンタを実装するメソッドであっても、ここでのcompareAndSetメソッドは以下のように定義されています。実際、JVM がプロセッサ自体の CAS 命令を呼び出してアトミックな操作を実装していることが推測できるはずです。 。 。


基本的に、AtomicInteger 型の重要なメソッドはロックフリーの方法で実装されます。 。したがって、同時環境では、このタイプを使用するとパフォーマンスが向上する可能性があります。 。 。

以上で、Java でロックフリー カウンターを実装することが完了しました。次に、ロックフリー スタックを実装し、コードを直接貼り付ける方法を見てみましょう。コードは、「JAVA Concurrent Programming Practice」から模倣されています。


public final int addAndGet(int delta) {
  for (;;) {
    int current = get();
    int next = current + delta;
    if (compareAndSet(current, next))
      return next;
  }
}
ログイン後にコピー

さて、上記のコードはロックフリーのスタックを実装しています。簡単です。 。 。同時環境では、ロックフリーのデータ構造は、ロックよりもはるかに優れた拡張性を実現できます。 。 。

ロックフリー プログラミングについて話すときは、ロックフリー キューについて言及する必要があります。実際、ロックフリー キューの実装は ConcurrentLinkedQueue で提供されています。その重要なメソッドの実装を見てみましょう。


public final boolean compareAndSet(int expect, int update) {
  return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
ログイン後にコピー
このメソッドは、キューの最後に要素を追加するために使用されます。ここでは、特定のロックフリー アルゴリズムについては、Michael-Scott によって提案されたノンブロッキング リンク リスト リンク アルゴリズムが使用されていることがわかります。使用済み。 。 。具体的にどのように機能するかを確認するには、「Java Concurrent Programming in Practice」でさらに詳しい概要をご覧ください。


さらに、他のメソッドも実際にはロックフリーの方法で実装されています。

最後に、実際のプログラミングでは、これらのロックフリー実装を同時環境で使用する方が良いです。結局のところ、その方がスケーラビリティが優れています。


概要


以上がcas 命令のロックフリー プログラミングを実装する Java の例の詳細内容です。詳細については、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 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

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

コーディングの鍵: 初心者のための Python の力を解き放つ コーディングの鍵: 初心者のための Python の力を解き放つ Oct 11, 2024 pm 12:17 PM

Python は、学習の容易さと強力な機能により、初心者にとって理想的なプログラミング入門言語です。その基本は次のとおりです。 変数: データ (数値、文字列、リストなど) を保存するために使用されます。データ型: 変数内のデータの型 (整数、浮動小数点など) を定義します。演算子: 数学的な演算と比較に使用されます。制御フロー: コード実行のフロー (条件文、ループ) を制御します。

Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Oct 11, 2024 pm 08:58 PM

Python は、問題解決の初心者に力を与えます。ユーザーフレンドリーな構文、広範なライブラリ、変数、条件文、ループによる効率的なコード開発などの機能を備えています。データの管理からプログラム フローの制御、反復的なタスクの実行まで、Python が提供します

C の謎を解く: 新人プログラマーのための明確でシンプルな道 C の謎を解く: 新人プログラマーのための明確でシンプルな道 Oct 11, 2024 pm 10:47 PM

C は、初心者がシステム プログラミングを学習するのに最適な選択肢です。ヘッダー ファイル、関数、メイン関数のコンポーネントが含まれています。 「HelloWorld」を印刷できる単純な C プログラムには、標準入出力関数宣言を含むヘッダー ファイルが必要で、main 関数で printf 関数を使用して印刷します。 C プログラムは、GCC コンパイラーを使用してコンパイルして実行できます。基本をマスターしたら、データ型、関数、配列、ファイル処理などのトピックに進み、熟練した C プログラマーになることができます。

未来を創る: まったくの初心者のための Java プログラミング 未来を創る: まったくの初心者のための Java プログラミング Oct 13, 2024 pm 01:32 PM

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Java をシンプルに: プログラミング能力を高める初心者向けガイド Java をシンプルに: プログラミング能力を高める初心者向けガイド Oct 11, 2024 pm 06:30 PM

Java をシンプルに: プログラミング能力の初心者向けガイド はじめに Java は、モバイル アプリケーションからエンタープライズ レベルのシステムに至るまで、あらゆるもので使用される強力なプログラミング言語です。初心者にとって、Java の構文はシンプルで理解しやすいため、プログラミングの学習に最適です。基本構文 Java は、クラスベースのオブジェクト指向プログラミング パラダイムを使用します。クラスは、関連するデータと動作をまとめて編成するテンプレートです。簡単な Java クラスの例を次に示します。 publicclassperson{privateStringname;privateintage;

内なるプログラマーを解き放つ: まったくの初心者のための C 内なるプログラマーを解き放つ: まったくの初心者のための C Oct 11, 2024 pm 03:50 PM

C は初心者がプログラミングを学ぶのに理想的な言語であり、効率性、汎用性、移植性などの利点があります。 C 言語の学習には次のことが必要です。 C コンパイラ (MinGW や Cygwin など) をインストールする 変数、データ型、条件文、ループ文を理解する main 関数と printf() 関数を含む最初のプログラムを作成する 実際のケースによる練習 (平均値の計算など) C言語の知識

See all articles