JUC之Atomic

其实,Atomic用起来十分简单,先来看两个例子

class Counter{
     private int count = 0 ;
     pulbic synchronized void increment(){
            count ++ ;
     }

     pulbic synchronized int getCount(){
        return count ;
     }
}

class Counter{
     private AtomicInteger count = new AtomticInteger() ;
     pulbic void increment(){
            count.incrementAndGet() ;
     }

     pulbic synchronized int getCount(){
        return count.get() ;
     }
}

这两个类的效果是一样的,只是性能上Atomic更好些,Atomic是基于CPU的CompareAndSwap(CAS)指令。其实,AtomicInteger就是线程安全的Integer。

再来看一段源码:

 /**
     * Atomically sets to the given value and returns the old value.
     *
     * @param newValue the new value
     * @return the previous value
     */
    public final int getAndSet(int newValue) {
        for (;;) {
            int current = get();
            if (compareAndSet(current, newValue))
                return current;
        }
    }

    /**
     * Atomically sets the value to the given updated value
     * if the current value {@code ==} the expected value.
     *
     * @param expect the expected value
     * @param update the new value
     * @return true if successful. False return indicates that
     * the actual value was not equal to the expected value.
     */
    public final boolean compareAndSet(int expect, int update) {
	return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

这里的方法的命令挺有意思的:看其方法名就能知道其方法实现的功能。getAndSet()  先get再set,有点类似i++,先取到i再i加1。源码还是比较清晰的。主要来看compareAndSet(int expect ,int update)这个方法,这个方法是说如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。如果成功就返回true,否则返回false,并且不修改当前值。 这其实也就是CAS的原理。

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