@boothsun
2018-03-09T01:32:21.000000Z
字数 2007
阅读 1307
Java多线程
在Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。Atomic包里的类基本都是使用Unsafe实现的包装类。
使用原子的方式更新基本类型,Atomic包提供了以下3个类:
以上3个类提供的方法几乎一模一样,所以这里仅以AtomicInteger为例进行讲解,AtomicInteger的常用方法如下:
通过原子的方式更新数组里的某个元素,Atomic包提供了以下4个类:
AtomicIntegerArray类主要是提供原子的方式更新数组里的整型,其常用方法如下:
原子更新基本类型的AtomicInteger,只能更新一个变量,如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类。Atomic包提供了以下3个类:
上面的三大类原子更新的方法都是以自旋+CAS的形式来保证原子更新的。
// AtomicIntegerpublic final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);}public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}// AtomicIntegerArraypublic final int getAndAdd(int i, int delta) {return unsafe.getAndAddInt(array, checkedByteOffset(i), delta);}public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}// AtomicReferencepublic final V getAndSet(V newValue) {return (V)unsafe.getAndSetObject(this, valueOffset, newValue);}public final Object getAndSetObject(Object var1, long var2, Object var4) {Object var5;do {var5 = this.getObjectVolatile(var1, var2);} while(!this.compareAndSwapObject(var1, var2, var5, var4));return var5;}
