即使一个简单的i++,在多线的环境下也是不安全的,但是加锁之后,效率又显得过于笨重。因此java提供了Atomic包,这个包中的原子类操作提供了一种用法简单,性能高效,线程安全的更新一个变量的方式
AtomicBoolean:原子更新布尔类型
AtomicInteger:原子更新整型
AtomicLong:原子更新长整型
以上三种就是原子类型基本更新类,至于三个类提供的方法,我就不介绍了,有兴趣可以去看java的api文档。
java中有八种基本数据类型,我们这里只有三个原子类型操作类,那么剩下的几种怎么更新呢。
public final native boolean compareAndSwapLong(Object o, long offset, long expected, long x);
public final native boolean compareAndSwapLong(Object o, long offset, long expected, int x);
public final native boolean compareAndSwapLong(Object o, long offset, long expected, object x);
由上面的代码,大家可以看出,所有原子的底层基本都是这三个方法。所以Boolean和其他类型,都是通过转为整型实现的。
AtomicReferencenArray:原子更新引用类型数组的元素
AtomicIntegerArray:原子更新整型数组的元素
AtomicLongArray:原子更新长整型数组的元素
AutomicReference:原子更新引用类型
AutomicReferenceFeildUpdater:原子更新引用类型里的字段
AutomicMarkableReference:原子更新带有标记位的引用类型
AutomicIntegerFeildUpdater:原子更新引用类型
AutomicLongFeildUpdater:原子更新引用类型里的字段
AutomicStampedReference:原子更新带有标记位的引用类型
这个带版本号的原子更新,就是为了解决著名的ABA问题,除此之外和其他的原子类操作,基本没有任何的区别。
原子类的使用比较少见,但是在多线程的环境下,如果可以利用好这个原子类。这个效率会比使用锁要高很多。