并发编程07--Java中的13个原子操作类

2019-09-21  本文已影响0人  叫我胖虎大人

当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,通常会使用synchronized.

Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。

实际上JDK1.8中在JUC中只有12个类:



原子更新基本类型

使用原子方式更新基本类型,Atomic包提供了以下3个类:

上述的三个类的方法基本上是一致的,所以以AtomicInteger为例进行讲解;
AtomicInteger常用的方法:

源码中for循环体的第一步先取得AtomicInteger里存储的数值,第二步对AtomicInteger的当前数值进行加1操作,关键的第三步调用compareAndSet方法来进行原子更新操作,该方法先检查当前数值是否等于current,等于意味着AtomicInteger的值没有被其他线程修改过,则将AtomicInteger的当前数值更新成next的值,如果不等compareAndSet方法会返回false,程序会进入for循环重新进行compareAndSet操作。

Atomic包里的类基本都是使用Unsafe实现的

Unsafe.java

AtomicBoolean源码中,发现它是先把Boolean转换成整型,再使用compareAndSwapInt进行CAS,所以原子更新char、float和double变量也可以用类似的思路来实现。


原子更新数组

通过原子方式更新数组里某个元素,Atomic包提供可以下3个类:

AtomicIntegerArray类主要是提供原子的方式更新数组里的整型,其常用方法如下。

数组通过构造方法传递进去,然后AtomicIntegerArray会将当前数组复制一份,所以当AtomicIntegerArray对内部的数组元素进行修改时,不会影响传入的数组


原子更新引用类型

原子更新基本类型的AtomicInteger,只能更新一个变量,如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类。

仅以AtomicReference为例


AtomicReferenceTest.java

代码中首先会创建一个user对象,把user对象设置进行AtomicReference中,最后调用compareAndSet方法进行原子更新操作,实现原理同AtomicInteger里的compareAndSet方法。代码执行后输出结果如下。

代码运行结果

原子更新字段类

要想原子地更新字段类需要两步.

以AtomicIntegerFieldUpdater为例:

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

public class AtomicIntegerFieldUpdaterTest {

    private static AtomicIntegerFieldUpdater<User> updater = AtomicIntegerFieldUpdater.newUpdater(User.class,"old");

    public static void main(String[] args) {
        //设置柯南的年龄为10岁
        User conan = new User("conan",10);
        //柯南长了一岁,但是仍然会输出旧的年龄
        System.out.println(updater.getAndIncrement(conan));
        //输出柯南现在的年龄
        System.out.println(updater.get(conan));
    }


    public static class User {
        private String name;
        public volatile int old;
        public User(String name,int old) {
            this.name = name;
            this.old = old;
        }
        public String getName() {
            return name;
        }
        public int getOld() {
            return old;
        }
    }
}

参考书籍:《Java并发编程的艺术》

上一篇 下一篇

猜你喜欢

热点阅读