前言:在并发编程中,许多地方都使用CAS 乐观锁的模式对值进行修改,在java java.util.concurrent.atomic 包中提供了一些原子类工具可以供我们使用;
1 Atomic使用:
1.1 基本数据类型(包装类):
// integer
AtomicInteger atomicInteger = new AtomicInteger();
atomicInteger.getAndSet(1);
// bolean
AtomicBoolean atomicBoolean = new AtomicBoolean();
atomicBoolean.getAndSet(false);
// long
AtomicLong atomicLong = new AtomicLong();
atomicLong.getAndSet(1);
// double
AtomicDouble atomicDouble = new AtomicDouble();
atomicDouble.getAndSet(1);
1.2 基本数据类型(包装数组类):
// integer
AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(new int[10]);
atomicIntegerArray.getAndSet(0,2);
// long
AtomicLongArray atomicLongArray = new AtomicLongArray(new long[10]);
atomicLongArray.getAndSet(0,2);
1.3 引用数据类型:
demo:
public class AtomicTest {
private static volatile AtomicReference<AtomicTest> atomicReference = new AtomicReference<AtomicTest>(null);
private static volatile AtomicReferenceArray<AtomicTest> atomicReferenceArray = new AtomicReferenceArray<AtomicTest>(new AtomicTest[10] );
private volatile Integer count = 100;
private volatile String name ;
public Integer getCount(){
return count;
}
public String getName(){
return name;
}
public AtomicTest(){
}
public AtomicTest(Integer count, String name) {
this.count = count;
this.name = name;
}
@Override
public String toString() {
return "AtomicTest{" +
"count=" + count +
", name='" + name + '\'' +
'}';
}
}
单个属性更新:
// 声明,第一个参数属性所属的类,第二参数熟悉的类型(String,Long ,Integer),第三个参数要更新的属性
AtomicReferenceFieldUpdater<AtomicTest,Integer> updater2 = AtomicReferenceFieldUpdater.newUpdater(AtomicTest.class,Integer.class,"count");
AtomicTest atomicTest = new AtomicTest();
// 更新
updater2.compareAndSet(atomicTest,0,100);
对象的更新:
AtomicTest atomicTest = atomicReference.get();
AtomicTest atomicTest1 = new AtomicTest(100,"lisi");
atomicReference.compareAndSet(atomicTest,atomicTest1);
System.out.println(atomicTest1);
数组<对象>的更新:
AtomicTest atomicTest = atomicReferenceArray.get(0);
AtomicTest atomicTest1 = new AtomicTest(100,"lisi");
atomicReferenceArray.compareAndSet(0,atomicTest,atomicTest1);
System.out.println(atomicTest1);
2 过程:
Atomic 中对值的修改,通过CAS 操作,先比对原有的数据是否已经被修改,如果没有被修改则替换成功,反之则替换失败。