乐观锁与悲观锁
独占锁
独占锁是一项悲观技术——它假设最坏的情况(如果你不锁门,那么捣蛋鬼就会闯入并搞得一团糟),并且只有在确保其他线程不会造成干扰(通过获取正确的锁)的情况下才能执行的下去。
乐观锁
对于细粒度的操作,还有另外一种更高效的方法,也是一种乐观的方法,通过这种方法可以在不发生干扰的情况下完成更新操作。这种方法需要借助冲突检查机制来判断在更新过程中是否存在来自其他线程的干扰,如果存在,这个操作将失败,并且可以重试(也可以不重试)。这种乐观的方法就好像一句谚语:"原谅比准许更容易得到",其中"更容易" 在这里相当于"更高效".
CAS(Compare-And-Set)包含了3个操作数 —— 需要读写的内存位置V、进行比较的值A 和 拟写入的新值B。当且仅当V的值等于A时,CAS 才会通过原子方式用新值B来更新V的值(这种变化形式被称为比较并设置) CAS的含义是:"我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少"。CAS 是一项乐观的技术,它希望能成功地执行更新操作,并且如果有另一个线程在最近一次检查后更新了该变量,那么CAS 能检测到这个错误
JVM 对 CAS 的支持:
AtomicInteger 类:
    /**
     * Atomically sets the value to {@code newValue}
     * if the current value {@code == expectedValue},
     * with memory effects as specified by {@link VarHandle#compareAndSet}.
     *
     * @param expectedValue the expected value
     * @param newValue the new value
     * @return {@code true} if successful. False return indicates that
     * the actual value was not equal to the expected value.
     */
    public final boolean compareAndSet(int expectedValue, int newValue) {
        return U.compareAndSetInt(this, VALUE, expectedValue, newValue);
    }
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/18628723

                
            
        
浙公网安备 33010602011771号