JAVA并发编程工具篇--4理解Atomic

前言:在并发编程中,许多地方都使用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 操作,先比对原有的数据是否已经被修改,如果没有被修改则替换成功,反之则替换失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值