public class SimulatedCAS {
    private int value;
    public synchronized int getValue() { return value; }
    public synchronized int compareAndSwap(int expectedValue, int newValue) {
        if (value == expectedValue) 
            value = newValue;
        return value;
    }
}public class CasCounter {
    private SimulatedCAS value;
    public int getValue() {
        return value.getValue();
    }
    public int increment() {
        int oldValue = value.getValue();
        while (value.compareAndSwap(oldValue, oldValue + 1) != oldValue)
            oldValue = value.getValue();
        return oldValue + 1;
    }
}一个CAS计数器程序。这是无锁定且无等待算法(书上说的,模拟机器指令CAS原语),想问下为什么不会等待,难道不会阻塞线程。。菜鸟求大神!!!!!多线程JavaCAS计数器

解决方案 »

  1.   

    public class CasCounter {
        private SimulatedCAS value;
        public int getValue() {
            return value.getValue();
        }
        public int increment() {
            int oldValue = value.getValue();
            while (value.compareAndSwap(oldValue, oldValue + 1) != oldValue)
                oldValue = value.getValue();
            return oldValue + 1;
        }
    }
    这个类里面,没有任何的锁,因此称之为无所
    当然,你可能会说,这个类调用了value.compareAndSwap(oldValue, oldValue + 1)方法,这个方法是加锁的,难道不会等待吗?
    答案是,该函数是一个模拟实现,目的是告诉你该函数的具体含义。完全按照这个程序执行,当然会等待。但是,请注意,他只是模拟。在实际情况下,CAS是CPU的一个原语,该操作只占用一个时钟周期,是无需等待的。因此,在实际操作环境下,是无需等待的