//在更新操作时提供“比较并替换”的作用 private static final Unsafe unsafe = Unsafe.getUnsafe(); //用来记录value本身在内存的偏移地址 private static final long valueOffset; //用来存储整数的时间变量,这里被声明为volatile,就是为了保证在更新操作时,当前线程可以拿到value最新的值 private volatile int value;
AtomicInteger(int initialValue) 初始化
1
public AtomicInteger(int initialValue){}
AtomicInteger()
1
public AtomicInteger(){}
get()获取当前值
1 2 3
public final int get() { return value; }
set(int value)设置值
1 2 3
public final void set(int newValue) { value = newValue; }
lazySet(int newValue)
1 2 3 4 5 6 7
//lazySet延时设置变量值,这个等价于set()方法,但是由于字段是 //volatile类型的,因此次字段的修改会比普通字段(非volatile //字段)有稍微的性能延时(尽管可以忽略),所以如果不是 //想立即读取设置的新值,允许在“后台”修改值,那么此方法就很有用。 public final void lazySet(int newValue) { unsafe.putOrderedInt(this, valueOffset, newValue); }
getAndSet(int newValue)设定新数据,返回旧数据
1
public final int getAndSet(int newValue) {}
compareAndSet(int expect,int update)比较并设置
1 2 3 4 5
public final boolean compareAndSet(int expect, int update) { //使用unsafe的native方法,实现高效的硬件级别CAS //native方法 return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }
weakCompareAndSet(int expect,int update)比较并设置
1 2 3
public final boolean weakCompareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }
getAndIncrement()以原子方式将当前值加 1,相当于线程安全的i++操作
1 2 3 4 5 6 7 8
public final int getAndIncrement() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return current; } }