並行プログラミング(6):原子(インタビューの詳細)

1つ:アトムクラスとは

 

 アトミックとは、複数のスレッドが一緒に実行された場合でも、操作が中断されないことを意味します。操作が開始されると、他のスレッドによる干渉を受けなくなります。

ベーシックタイプ

アトミックメソッドを使用して基本型を更新する

  • AtomicInteger:アトムクラスの形成
  • AtomicLong:ロングアトムタイプ
  • AtomicBoolean:ブールアトムクラス

配列タイプ

アトミックメソッドを使用して配列の要素を更新する

  • AtomicIntegerArray:整数配列のアトミッククラス
  • AtomicLongArray:長整数配列アトムクラス
  • AtomicReferenceArray:参照型配列のアトミッククラス

参照タイプ

  • AtomicReference:参照型のアトミッククラス
  • AtomicStampedReference:参照タイプの原子更新フィールドタイプ
  • AtomicMarkableReference:マークビット付きのアトミック更新参照型

オブジェクトプロパティ変更タイプ

  • AtomicIntegerFieldUpdater:Atomic updater updater
  • AtomicLongFieldUpdater:長整数フィールドをアトミ​​ックに更新するためのアップデーター
  • AtomicStampedReference:バージョン番号を持つアトミック更新参照タイプ。このクラスは、整数値を参照に関連付け、アトミック更新データとデータバージョン番号を解決するために使用できます。CASを使用してアトミック更新を実行するときに発生する可能性のあるABA問題を解決できます。

 

2:一般的な方法

例としてAtomicIntegerを取り上げます

public final int get() //获取当前的值
public final int getAndSet(int newValue)//获取当前的值,并设置新的值
public final int getAndIncrement()//获取当前的值,并自增
public final int getAndDecrement() //获取当前的值,并自减
public final int getAndAdd(int delta) //获取当前的值,并加上预期的值
boolean compareAndSet(int expect, int update) //如果输入的数值等于预期值,则以原子方式将该值设置为输入值(update)
public final void lazySet(int newValue)//最终设置为newValue,使用 lazySet 设置之后可能导致其他线程在之后的一小段时间内还是可以读到旧的值。

3:AtomicIntegerクラスの原則

 

ソースコード:

private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
    try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
    } catch (Exception ex) { throw new Error(ex); }
}
private volatile int value;

主にCAS(比較およびスワップ)+揮発性およびネイティブメソッドを使用して、アトミック操作を保証します。

詳細については、CASメカニズムについての記事を参照してください。

 

最後に、確立された慣行に従って、妻のタウンハウス。


 

元の記事を28件公開しました 賞賛されました0 訪問9931

おすすめ

転載: blog.csdn.net/weixin_38246518/article/details/105591201