AtomicInteger クラスは、下部に int 値を格納し、int 値に対してアトミックな操作を実行するメソッドを提供します。 AtomicInteger は、java.util.concurrent.atomic
パッケージの一部として Java 1.5 から導入されました。
次の AtomicInteger
構築メソッドにより、AtomicInteger
オブジェクトを作成できます。デフォルトは 0 です。 AtomicInteger
基になる int 整数値を取得し、int 整数値を設定するための get メソッドと set メソッドを提供します。
//初始值为0的atomicInteger对象 AtomicInteger atomicInteger = new AtomicInteger(); //初始值为200的atomicInteger对象 AtomicInteger atomicInteger = new AtomicInteger(200); int currentValue = atomicInteger.get(); //100 atomicInteger.set(2453); //现在的值是 2453
ただし、上記のメソッドは AtomicInteger
のコアには適していません。 content, AtomicInteger
コアのコンテンツはそのアトミック性に反映されており、これについては以下で紹介します。
通常、次の 2 つのシナリオで使用します。AtomicInteger
マルチでカウンターを操作するには-スレッド同時シナリオでは、カウンター操作のアトミック性を確保する必要があります。
値を比較します。指定された値が現在の値と等しい場合は、値を更新し、操作にノンブロッキング アルゴリズムを実装します。
カウンターとして AtomicInteger
を使用する AtomicInteger
は、加算と減算のアトミック操作のためのメソッドをいくつか提供します。
たとえば、マップから値を取得するには、最初の操作である get() メソッドを使用します。値を取得した後、値に n を加算します (2 番目の操作)。加算操作です。 3 番目の操作は、マップに値を再度入力することです。いわゆる操作のアトミック性とは、マルチスレッドの同時実行シナリオでは、上記の 3 つの操作がアトミックである、つまり分割できないことを意味します。スレッド A が値を取得し、スレッド B も同時に値を取得するという状況はありません。2 つのスレッドは同時に値に対する操作を実行し、次々に値を再度入力します。この状況は、次のような場合には適していません。 AtomicInteger
AtomicInteger
操作はスレッドセーフで分割不可能であるように見えます。
addAndGet()
- 指定された値を現在の値に加算し、加算後に新しい値を返し、操作のアトミック性を確保します。
getAndAdd()
- 指定された値を現在の値に加算して古い値を返し、操作のアトミック性を確保します。
incrementAndGet()
- 現在の値を 1 ずつ増加させ、増加後の新しい値を返します。これは i
操作と同等であり、操作のアトミック性が保証されます。
getAndIncrement()
- 現在の値を 1 増やして、古い値を返します。 i
操作と同等であり、操作のアトミック性が保証されます。
decrementAndGet()
- 現在の値から 1 を減算し、減算後の新しい値を返します。これは i--
操作と同等であり、アトミック性が保証されます。手術のセックス。
getAndDecrement()
- 現在の値から 1 を減算し、古い値を返します。これは --i
操作と同等であり、操作のアトミック性が保証されます。
次は、AtomicInteger
public class Main { public static void main(String[] args) { //初始值为100的atomic Integer AtomicInteger atomicInteger = new AtomicInteger(100); System.out.println(atomicInteger.addAndGet(2)); //加2并返回102 System.out.println(atomicInteger); //102 System.out.println(atomicInteger.getAndAdd(2)); //先获取102,再加2 System.out.println(atomicInteger); //104 System.out.println(atomicInteger.incrementAndGet()); //加1再获取105 System.out.println(atomicInteger); //105 System.out.println(atomicInteger.getAndIncrement()); //先获取105再加1 System.out.println(atomicInteger); //106 System.out.println(atomicInteger.decrementAndGet()); //减1再获取105 System.out.println(atomicInteger); //105 System.out.println(atomicInteger.getAndDecrement()); //先获取105,再减1 System.out.println(atomicInteger); //104 } }
compareAndSet 操作は、メモリ位置の内容を指定された値と比較します。 value 比較が行われ、それらが同一である場合にのみ、そのメモリ位置の内容が指定された新しい値に変更されます。このプロセスは、単一のアトミック操作として完了します。
compareAndSet メソッド: 現在の値 == 期待値の場合、値を指定された更新された値に設定します。
boolean compareAndSet(int expect, int update)
expect
は期待値
update
は更新された値
AtomicInteger CompareAndSet() メソッドの例
import java.util.concurrent.atomic.AtomicInteger; public class Main { public static void main(String[] args) { //初始值为100的atomic Integer AtomicInteger atomicInteger = new AtomicInteger(100); //当前值100 = 预期值100,所以设置atomicInteger=110 boolean isSuccess = atomicInteger.compareAndSet(100,110); System.out.println(isSuccess); //输出结果为true表示操作成功 //当前值110 = 预期值100?不相等,所以atomicInteger仍然等于110 isSuccess = atomicInteger.compareAndSet(100,120); System.out.println(isSuccess); //输出结果为false表示操作失败 } }
AtomicInteger
は、同期ロックを使用せずに、マルチスレッド シナリオでの int 数値操作のスレッド セーフ性とアトミック性を実現するのに役立ちます。また、AtomicInteger
を使用して int 値に対するアトミック操作を実装することは、同期された同期ロックを使用するよりもはるかに効率的です。
java.util.concurrent.atomic
パッケージは、AtomicInteger
を提供するだけでなく、AtomicBoolean Boolean アトミック操作クラスと AtomicLong long integer Boolean アトミック操作も提供します。 class 、AtomicReference オブジェクトのアトミック操作クラス、AtomicIntegerArray 整数配列のアトミック操作クラス、AtomicLongArray 長整数配列のアトミック操作クラス、AtomicReferenceArray オブジェクト配列のアトミック操作クラス。
以上がJava並行プログラミング:AtomicIntegerの使用例の分析 JUC ToolkitのAtomic Integerの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。