一、简介java.util.concurrent契约为我们提供了12个原子操作类,分别属于原子更新的四种类型,是原子更新的基本类型,Atomic更新数组、原子更新引用类型和原子更新属性。这些原子操作类内部是通过Unsafe类提供的一些局部方法(原子操作)来实现的,比如大家熟悉的CAS操作compareAndSwapInt,从主存中读取最新值getIntVolatile等。2.原子更新的类型2.1原子更新的基本类型基本类型是原子更新。atomic包提供了3个类:AtomicBoolean:原子更新布尔型AtomicInteger:原子更新整型AtomicLong:原子更新长整型以上三个类提供的方法基本相同。例如AtomicInteger的一些方法如下://将输入值和实例中的值以原子方式相加,返回相加后的值intaddAndGet(intdelta)//如果输入值等于期望值,然后自动将该值设置为输入值,成功则返回true,否则返回falsebooleancompareAndSet(intexpect,intupdate)//自动将当前值加1,返回自增前的值intgetAndIncrement()//以原子方式设置newValue的值并返回旧值intgetAndSet(intnewValue)2.2原子更新数组以原子方式更新数组中的元素。atomic包提供了3个类:AtomicIntegerArray:原子更新整数数组中的元素AtomicLongArray:原子更新长整数数组中的元素AtomicReferenceArray:原子更新引用类型数组中的元素以AtomicIntegerArray为例,主要更新整数以原子方式在数组中,一些方法如下://以原子方式将输入值添加到数组中索引i处的元素,并返回intaddAndGet(inti,intdelta)//如果当前值等于期望值,原子添加数组第i位置的元素设置为更新值,成功返回true,否则返回falsebooleancompareAndSet(inti,intexpect,intupdate)2.3原子更新引用类型更新引用类型in一种原子方式,原子包提供了3个类:AtomicReference:原子更新引用类型AtomicStampedReference:原子更新带版本号的引用类型,可以解决ABA问题AtomicMarkableReference:原子更新带标记位的引用类型这里,AtomicReference以为例,主要以原子方式更新引用类型,部分方法如下://如果当前值指向pair如果对象指向的对象与expect相同,则更新值以原子方式更新,即value指向update指向的对象booleancompareAndSet(Vexpect,Vupdate)//updatevalueto以原子方式newValue,并返回valueVgetAndSet(VnewValue)的旧值2.4原子更新属性以原子方式更新对象中的属性。原子包提供了3个类:AtomicIntegerFieldUpdater:原子更新整数属性AtomicLongFieldUpdater:原子更新长整数属性AtomicReferenceFieldUpdater:使用原子更新引用类型属性时,必须先使用静态方法newUpdater()创建一个updater,传入要更新的类和属性名称。注意:要更新的字段必须是volatile类型。示例如下:privatestaticAtomicIntegerFieldUpdater
