原子型フィールド更新器AtomicXxxxFieldUpdater
3013 ワード
このブログシリーズは、同時プログラミングを学習する際の記録のまとめです.文章が多くて、書く時間もバラバラなので、ディレクトリシール(転送ドア)を整理して、調べやすいです.
同時プログラミングシリーズブログ転送ゲート
AtomicIntegerFieldUpdater:反射されたツールクラスに基づいて、指定されたオブジェクトの指定されたintタイプフィールドを原子的に更新できます. AtomicLongFieldUpdater:反射されたツールクラスに基づいて、指定されたオブジェクトの指定されたlongタイプフィールドを原子的に更新できます. AtomicReferenceFieldUpdater:反射されたツールクラスに基づいて、指定されたオブジェクトの指定された適用タイプフィールドを原子的に更新できます.
原子型フィールド更新器は内部でUnsafeクラスのnative法により動作の原子性を保証する.
原子型フィールド更新器の使用については、次の点に注意してください.フィールドは、可視性を保証するためにvolatileタイプである必要があります. フィールドとフィールド更新器のアクセスタイプ(public/protected/private)は一致する必要があります. フィールドはインスタンス変数のみであり、クラス変数(static)ではありません. フィールドはfinalの変数ではありません.このようなフィールドは変更できません. IntegerとLongタイプを処理する場合は、AtomicReferenceFieldUpdater を使用する必要があります.
まず、上記の3つの原子型フィールド更新器の一般的な方法を学びます.これらの方法は以下の通りです.コンストラクタ:パラメータなしprotectedのコンストラクタは1つしか使用できません. newUpdater(fieldClass,fieldName):指定されたフィールドと指定されたタイプの原子型フィールド更新器インスタンスオブジェクトを作成および戻すための、原子型フィールド更新器が提供する静的汎用メソッド. get(obj):原子性と可視性を有する値を付与します. set(obj):原子性と可視性を有する値をとる. lazySet(obj,newValue):付与され、原子性を有し、可視性を備えていない. getAndSet(obj,newValue):原子性と可視性を持つ値を割り当て、古い値を返します. compareAndSet(obj,expect,update):現在所望の値である場合、割り当てが成功したかどうかが返され、原子性と可視性があります. weakCompareAndSet(obj,expect,update):compareAndSet(obj,expect,update)と似ています.
原子型フィールド更新器の一般的な方法は、通常の原子型の一般的な方法と同様であり、唯一の違いは、obj(変更されたフィールドの属するオブジェクト)のパラメータが1つ増えたことである.
AtomicIntegerFieldUpdaterとAtomicLongFieldUpdaterの独自の方法です.次の方法AtomicReferenceFieldUpdaterクラスにはありません. getAndAdd(obj):原子性と可視性を持つ増分計算と古い値を返します. addAndGet(obj):原子性と可視性を持つ増分計算と新しい値を返します. getAndIncrement(obj):i++のように、原子性と可視性を有する古い値を自己増加して返します. incrementAndGet(obj):原子性と可視性を有する++iのような新しい値を自己増加して返します. getAndDecrement(obj):i--のような古い値を減算して返し、原子性と可視性を有します. decrementAndGet(obj):原子性と可視性を有するiのような新しい値を自己減算して返します.
同時プログラミングシリーズブログ転送ゲート
アトミックフィールド更新器
java.util.concurrent.atomic
では、原子型フィールド更新器には、次の3つがあります.ルールの使用
原子型フィールド更新器は内部でUnsafeクラスのnative法により動作の原子性を保証する.
原子型フィールド更新器の使用については、次の点に注意してください.
列子の使用(AtomicIntegerFieldUpdaterを列とする)
public class AtomicIntegerFieldUpdaterTest {
private static AtomicIntegerFieldUpdater a = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
public static void main(String[] args) {
// 10
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(String name,int old) {
this.name = name;
this.old = old;
}
public String getName() {
return name;
}
public int getOld() {
return old;
}
}
}
メソッドの説明
まず、上記の3つの原子型フィールド更新器の一般的な方法を学びます.これらの方法は以下の通りです.
原子型フィールド更新器の一般的な方法は、通常の原子型の一般的な方法と同様であり、唯一の違いは、obj(変更されたフィールドの属するオブジェクト)のパラメータが1つ増えたことである.
AtomicIntegerFieldUpdaterとAtomicLongFieldUpdaterの独自の方法です.次の方法AtomicReferenceFieldUpdaterクラスにはありません.