ホームページ  >  記事  >  Java  >  Java並行プログラミング:AtomicIntegerの使用例の分析 JUC ToolkitのAtomic Integer

Java並行プログラミング:AtomicIntegerの使用例の分析 JUC ToolkitのAtomic Integer

WBOY
WBOY転載
2023-04-25 22:22:30831ブラウズ

    AtomicInteger クラスは、下部に int 値を格納し、int 値に対してアトミックな操作を実行するメソッドを提供します。 AtomicInteger は、java.util.concurrent.atomic パッケージの一部として Java 1.5 から導入されました。

    1. AtomicInteger の基本的な使い方

    次の 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 を使用する必要があるのはどのような場合ですか。

    通常、次の 2 つのシナリオで使用します。AtomicInteger

    マルチでカウンターを操作するには-スレッド同時シナリオでは、カウンター操作のアトミック性を確保する必要があります。

    値を比較します。指定された値が現在の値と等しい場合は、値を更新し、操作にノンブロッキング アルゴリズムを実装します。

    2.1. アトミック カウンター シナリオ

    カウンターとして 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
        }
    }

    2.2 のアトミック操作メソッドの例です。数値比較および交換操作

    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表示操作失败
        }
    }

    3. 概要

    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 サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。