《java并发编程的艺术》原子操作类

java.util.concurrent.atomic包,4种原子更新方式:原子更新基本数据,原子更新数组,原子更新引用,原子更新属性。

原子更新基本类型

包含3个类:AtomicBoolean,AtomicInteger,AtomicLong

AtomicInteger为例,常用方法有:
- int addAndGet(int delta) 以原子方式相加并返回结果
- boolean compareAndSet(int expect,int update)如果输入的数值等于预期值,则以原子方式将该值设置为输入的值
- int getAndIncrement()以原子方式将当前值加1,返回自增前的值
- void lazySet(int newValue)将值设置为newValue,但是需要一些时间。
- int getAndSet(int newValue)以原子方式设置为newValue,返回旧值

        AtomicInteger a = new AtomicInteger(5);
        System.out.println(a.getAndIncrement()); //输出5  值为6
        System.out.println(a.getAndIncrement()); //输出6  值为7
        System.out.println(a.compareAndSet(7, 9)); //此时值为7,所以值会变更为9并返回true。否则返回false,值不变。

原子更新数组

包含4个类:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray,AtomicIntegerArray,AtomicDoubleArray

常用方法:
- int addAndGet(int i,int delta)以原子方式将索引为i的和delta相加。
- boolean compareAndSet(int i,int expect,int update)获取索引i的值compareAndSet

        int[] b = new int[]{1, 2};
        AtomicIntegerArray array = new AtomicIntegerArray(b);
        System.out.println(array.addAndGet(0, 5));//array索引为0的值更新为6

原子更新引用类型

包含3个类:AtomicReference,AtomicReferenceFieldUpdater,AtomicMarkableReference

        User user = new User("www",20);
        User user1 = new User("ww", 5);
        AtomicReference<User> reference = new AtomicReference<>();
        reference.set(user);
        reference.compareAndSet(user, user1);
        System.out.println(reference.get().getName()); //[5, 6]

原子更新字段类

原子更新某个类里的某个字段:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicStampedReference
要想原子的更新字段有两步:
1.使用静态方法newUpdater创建一个更新器,并且设置欲更新的类和属性
2.更新类的字段必须使用public volatile修饰符

        AtomicIntegerFieldUpdater<User> atomicIntegerFieldUpdater = AtomicIntegerFieldUpdater.newUpdater(User.class, "age");
        //User有一个字段为age,相当于操作该字段

猜你喜欢

转载自blog.csdn.net/saywhat_sayhello/article/details/81095353
今日推荐