java.util.concurrent.atomicパッケージには、Atomicの最初に多くのアトミック操作クラスがあります。Javaで一般的に使用される数値型に関しては、次の図に示すように、基本的に対応するAtomicアトミック操作クラスがあります。Atomic
の最初のアトミック操作クラスは、同時実行性の高いシナリオでスレッドセーフであり、自信を持って使用できます。
1.AtomicInteger
これは主にUnsafeクラスのCAS操作を呼び出すためのものであり、以下はAtomicIntegerのソースコードの一部です。
public class AtomicInteger extends Number implements java.io.Serializable {
// 注:value是被volatile修饰的
private volatile int value;
// 初始化
public AtomicInteger(int initialValue) {
value = initialValue;
}
// 得到当前值
public final int get() {
return value;
}
// 自增 1,并返回自增之前的值
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
// 自减 1,并返回自增之前的值
public final int getAndDecrement() {
return unsafe.getAndAddInt(this, valueOffset, -1);
}
}
ソースコードから、スレッドセーフな操作メソッドはすべて下部にある安全でないメソッドを使用して実装されていることがわかります。上記の安全でないメソッドはJavaでは実装されておらず、すべてスレッドセーフです。
2.AtomicReference
AtomicIntegerは、int型の値を増減します。Atomicオブジェクトがカスタムクラスの場合はどうなりますか?Javaは、AtomicReferenceと呼ばれるカスタムオブジェクト用のアトミック操作クラスも提供します。AtomicReferenceクラスの操作可能なオブジェクトはジェネリックであるため、カスタムクラスをサポートしています。最下層には自己インクリメントメソッドがありません。操作メソッドは関数パラメーターとして渡すことができます。ソースコードは次のとおりです。
// 对 x 执行 accumulatorFunction 操作
// accumulatorFunction 是个函数,可以自定义想做的事情
// 返回老值
public final V getAndAccumulate(V x,BinaryOperator<V> accumulatorFunction) {
// prev 是老值,next 是新值
V prev, next;
// 自旋 + CAS 保证一定可以替换老值
do {
prev = get();
// 执行自定义操作
next = accumulatorFunction.apply(prev, x);
} while (!compareAndSet(prev, next));
return prev;
}