private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
private volatile int value;
这里的valueOffset 指的是value值相对于AtomicInteger对象首地址的在内存中偏移量,根据这个地址可以准确的定位value的值。volatile 可以保证不同线程下的内存可见性,
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
getAndIncrement的操作相当于一个乐观锁,每次进行i++操作前先获取到原来的value值,最终进行改变数据时,比较当前所持有的value值和原来的value值current 是否一致,如果一致会进行修改值的操作。不一致的情况下会循环调用进行比较(随之带来的就是性能问题,会一直进行死循环,直到修改完value中的值)
compareAndSet的代码如下
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
主要传入当前的值this 和valueOfferset,这样可以定位到原本的value值,和excepte进行比较,如果线程不安全,就返回false.如果线程安全,将update的值赋给value.
本文深入解析了AtomicInteger类的工作原理,特别是其getAndIncrement方法如何实现线程安全的自增操作,并详细解释了Unsafe类及compareAndSet方法的作用。
451

被折叠的 条评论
为什么被折叠?



