AtomicInteger,AtomicLong、AtomicBoolean
以AtomicInteger为例。下面的代码操作count是线程安全的。
public class Sample {
private static AtomicInteger count = new AtomicInteger(0);
public static void increment() {
count.getAndIncrement();
}
}
AtomicInteger的实现原理是基于CAS的乐观锁。内部实现如下
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
也是因为这个原因,如果竞争非常激烈,请不要使用AtomicInteger。因为CPU循环等待尝试CAS操作是非常消耗cpu资源的。
AtomicInteger并不等同与Integer。体现在equals方法上,Integer重写了equals,可以通过equals比较实际包含值是否相等,但是AtomicInteger没有。你只能先将int值取出,然后再比较。
另外需要注意的是,这三个类中方法返回的都是基本数据类型int,long和bool。当然大家知道Interger和int的区别。那么对于对象(引用)的操作,我们由将如何使用JUC中的atomic包呢?
AtomicReference
private volatile V value;
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicReference.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
public final boolean weakCompareAndSet(V expect, V update) {
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}
其实没有什么区别,只是使用了针对对象的CAS操作+volatile机制罢了。