java多线程(3):JUC中的atomic包

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机制罢了。

    原文作者:JUC
    原文地址: https://blog.csdn.net/define_us/article/details/79487178
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞