導入
Javaは、JDK1.5以来のJava.util.concurrent.atomicパッケージを提供します。原子変数の基礎となる層はプロセッサが提供する原子命令を使用しますが、異なるCPUアーキテクチャは異なる原子命令を提供する場合があり、何らかの形の内部ロックが必要になる場合があるため、この方法はスレッドがブロックされないことを絶対に保証することはできません。
アトミックパッケージの紹介
アトミックパッケージには12のクラスがあり、4つのアトミック更新方法は、Atomic Update Basic Type、Atomic Update Array、Atomic Update References、Atomic Updateフィールドです。 Atomic Packageのクラスは、基本的にUnsafeを使用して実装されたラップクラスです。
アトミック更新基本型クラス
原子法を介して基本タイプを更新するために、Atomic Packageは次の3つのクラスを提供します。
Atomicboolean:Atomicはブールタイプを更新します。
AtomicInteger:Atomic Update Integer。
Atomiclong:Atomic Update Long Integer。
AtomicIntegerの一般的な方法は次のとおりです。
int addandget(int delta):インスタンス(Atomicintegerの値)の入力値をAtomicの方法で追加し、結果を返します
Boolean CompareAndset(int expect、int update):入力値が期待値に等しい場合、値を原子的に入力値に設定します。
int getandincrement():現在の値を1に1に追加します。注:ここでの返された値は、自動インクリメントの前の値です。
void lazyset(int newValue):最終的にはnewValueに設定されます。 Lazysetを使用して値を設定した後、他のスレッドは古い値int getandset(int newValue)を読み取ることができる場合があります。これは、newValueの値にアトミック的に設定され、古い値を返します。
AtomicIntegerの例コードは次のとおりです。
Import java.util.concurrent.atomic.atomicinteger; public class atomicintegertest {static atomicinteger ai = new AtomicInteger(1); public static void main(string [] args){system.out.println(ai.getandincrement());出力
12
アフターディナーデザート
Atomic Packageは、3つの基本的なタイプのアトミックアップデートを提供しますが、Java BasicタイプにはChar、Float、およびDoubleが含まれます。問題は、他の基本タイプの原子を更新する方法です。アトミックパッケージのクラスは、基本的にUnsafeを使用して実装されています。安全でないソースコードを見てみましょう。 Unsafeは、Campareandswapobject、Compareandswapint、およびCompareandswaplongの3つのCASメソッドのみを提供することがわかりました。次に、Atomicbooleのソースコードを見てください。最初にbooleanを整数に変換し、次にCASに比較アンドワピントを使用するため、同様のアイデアを使用してアトミックアップデートダブルも実装できることがわかりました。
アトミックアップデートアレイクラス
アトミックパッケージは、次の3つのクラスを提供します。
AtomicIntegerArray:整数配列内の要素を原子的に更新します。
Atomiclongarray:Atomicは、長い配列の要素を更新します。
AtomicReferencearray:Atomicは、参照型配列の要素を更新します。
AtomicIntegerArrayクラスは、主にAtomicを提供して、配列内の整数を更新します。一般的に使用される方法は次のとおりです
int addandget(int i、int delta):アレイの要素インデックスIに入力値を原子的に追加します。
Boolean CompareAndset(int i、int expect、int update):現在の値が期待値に等しい場合、配列位置の要素はアトミックに更新値に設定されます。
例コードは次のとおりです。
パブリッククラスAtomicIntegerArraytest {static int [] value = new int [] {1、2}; static atomicintegerArray ai = new AtomicintegerArray(value); public static void main(string [] args){ai.getandset(0、 3); system.out.println(ai.get(0)); system.out.println(value [0]);}}}出力
31
AtomicIntegerArrayクラスで注意する必要があるのは、配列値がコンストラクターメソッドを介して渡され、AtomicIntegerArrayが現在の配列にコピーをコピーするため、AtomicIntegerArrayが内部アレイ要素を変更すると、合格した配列に影響しないことです。
アトミック更新リファレンスタイプ
基本的なタイプであるAtomicIntegerは、1つの変数のみを更新できます。複数の変数を原子的に更新する場合は、この原子を使用して、参照タイプで提供されるクラスを更新する必要があります。アトミックパッケージは、次の3つのクラスを提供します。
AtomicReference:Atomic Reference Typeを更新します。
AtomicReferenceFieldUpDater:Atomic Update fields fields in the Referent type。
AtomicMarkablereference:Atomicは、マーカービットを使用して参照型を更新します。ブール型タイプのタグビットと参照タイプをアトミックに更新できます。構築方法はAtomicMarkablereferenceです(V InitialRef、Boolean InitialMark)
AtomicReferenceを使用するためのコードは次のとおりです。
Public Class AtomicReferencetest {public Static AtomicReference <user> AtomicUserRef = new AtomicReference </user> <user>(); public static void main(string [] args){user user = new user( "conan"、15); atomicuserref.set(user); user updetuser = new user = new user(shinich " updateUser); system.out.println(atomicuserref.get()。getname()); system.out.println(atomicuserref.get()。getold();} static class name {private string name; private int old; public user(string name、int old){name = public getname; getold(){return old;}}}出力
shinichi17
アトミックアップデートフィールドクラス
特定のクラスで特定のフィールドのみが必要な場合は、Atomicを使用してフィールドクラスを更新する必要があります。アトミックパッケージは、次の3つのクラスを提供します。
Atomicintegerfieldupdater:整数を原子的に更新するフィールドのアップデーター。
AtomicLongFieldUpDater:Atomic UpdateのアップデーターLong Integerフィールド。
AtomicStampedReference:Atomicは、バージョン番号で参照タイプを更新します。このクラスは、整数の値を参照と関連付け、原子より多くのデータとバージョン番号に使用できます。これは、AtomicアップデートにCASを使用するときに発生する可能性のあるABAの問題を解決できます。
Atomic Update Fieldクラスは抽象クラスであり、使用するたびに、newUpdaterの静的メソッドを使用してアップデーターを作成する必要があります。公共揮発性修飾子は、Atomic Updateクラスのフィールドに使用する必要があります。
最初のステップは、Atomic Update Fieldクラスは抽象クラスであるため、Static Method AtomicIntegerFieldUpDater.NewUpDaterを使用するたびに、アップデートを作成し、更新するクラスとプロパティを設定する必要があることです。 2番目のステップは、クラスのフィールド(プロパティ)を更新することです。
Atomicintegerfieldupdaterの例の例は次のとおりです。
Public Class AtomicIntegerFieldUpDatertest {private static Atomicintegerfieldupdater <user> a = atomicintegerfieldupdater.newupdater(user.class、 "old"); public static void main(string [] args){user conan = new user( "conan"、 10); system.out.println(a.getandincrement(conan)); system.out.println(a.get(conan));} public static class user {private string name; public volatile int old; public user name; int old){this.name = name; this.old = old;} public string getname()出力
1011
要約します
上記は、Java Multi-Threaded Atomicパッケージの紹介と使用に関するこの記事の内容全体です。私はそれが誰にでも役立つことを願っています。興味のある友達は引き続きこのサイトを参照できます:
Javaマルチスレッドのさまざまな条件下で生産消費者モデルを作成する方法の紹介
JavaマルチスレッドプログラミングシンクロナイザーFutureとFutureTaskの解析とコードの例
Javaマルチスレッドディスプレイロックと内蔵ロックの詳細な説明
欠点がある場合は、それを指摘するためにメッセージを残してください。