Atomic原子操作类

发表时间:2017-08-10 16:46:17 浏览量( 24 ) 留言数( 0 )

学习目标:

1、了解Atomic原子类的实现原理

2、在程序中灵活的使用Atomic


学习过程:

    理解原子性的实现,使用Compare-and-swap(CAS )是一个针对非抢占式微处理器的一条指定指令的宽泛术语,这条指令读取内存的位置,比较读到的值和期望的值,当读到的值和期望的值匹配时,就将新值存储到该内存位置: 否则,什么事也不会发生。所以器效率比使用synchronized同步的方法要高, 而且不会发生死锁等问题。

    Atomic包里一共有12个类,四种原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新字段。Atomic包里的类基本都是使用Unsafe实现的包装类。

1、原子更新基本类型类

用于通过原子的方式更新基本类型,Atomic包提供了以下三个类:

AtomicBoolean:原子更新布尔类型。

AtomicInteger:原子更新整型。

AtomicLong:原子更新长整型。

AtomicInteger的常用方法如下:

常用的方法:

int addAndGet(int delta) :以原子方式将输入的数值与实例中的值(AtomicInteger里的value)相加,并返回结果

boolean compareAndSet(int expect, int update) :如果输入的数值等于预期值,则以原子方式将该值设置为输入的值。

int getAndIncrement():以原子方式将当前值加1,注意:这里返回的是自增前的值。

示例:

public class TestAtomicInteger {
    static AtomicInteger ai = new AtomicInteger(1);
    public static void main(String[] args) {

        System.out.println(ai.getAndIncrement());
        System.out.println(ai.get());

    }
}


2、原子更新数组类

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

AtomicIntegerArray:原子更新整型数组里的元素。

AtomicLongArray:原子更新长整型数组里的元素。

AtomicReferenceArray:原子更新引用类型数组里的元素。

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

常用方法:

int addAndGet(int i, int delta):以原子方式将输入值与数组中索引i的元素相加。

boolean compareAndSet(int i, int expect, int update):如果当前值等于预期值,则以原子方式将数组位置i的元素设置成update值。

实例代码如下:

public class TestAtomicIntegerArray {

	static int[] value = new int[] { 1, 2 };
	static AtomicIntegerArray ai = new AtomicIntegerArray(value);
	public static void main(String[] args) {

		ai.getAndSet(0, 3);
		System.out.println(ai.get(0));
		System.out.println(value[0]);

	}

}

输出

3

1

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