美文网首页
005--原子变量-CAS算法

005--原子变量-CAS算法

作者: 糖纸疯了 | 来源:发表于2018-05-04 17:57 被阅读27次

    话题一:什么是原子性?

      i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写”
      int i = 10;
      i = i++; //10
    
      int temp = i;
      i = i + 1;
      i = temp;
    
    • 本身来说,i++不能将过程进行拆解,但是volatile不能保证原子性,如果在多线程下就会被拆开,数据的执行结果就会出错!

    • 如何在不使用synchronized降低性能的条件下依然保证原子性,java.util.concurrent.atomic下提供了相关的工具类!

    • concurrent原子工具类 image.png

    话题二:java.util.concurrent.atomic如何保证原子性?

    • CAS(Compare-And-Swap) 算法保证数据变量的原子性
    • CAS 算法是硬件对于并发操作的支持
    • CAS 包含了三个操作数:
      ①内存值 V
      ②预估值 A
      ③更新值 B
      当且仅当 V == A 时, V = B; 否则,不会执行任何操作。

    话题三:CAS效率比synchronized效率高吗?

    • CAS比synchronized效率高
    • 多线程时,因为要compare,所以能够保证只有一个线程在操作数据
    • 其他的线程不会被阻塞(可以手动写相关逻辑,再次操作数据,直至成功操作数据)

    话题四:模拟CAS算法?

    // 目标:有一个参考值,和参考值进行比较,相同就进行重新赋值
    public class TestCompareAndSwap {
        public static void main(String[] args) {
            final CompareAndSwap cas = new CompareAndSwap();
            
            for (int i = 0; i < 10; i++) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        int expectedValue = cas.get();
                        boolean b = cas.compareAndSet(expectedValue, (int)(Math.random() * 101));
                        System.out.println(b);
                    }
                }).start();
            }
        }
    }
        
    class CompareAndSwap {
        private int value;
        // 获得内存中的值
        public synchronized int get() {
            return value;
        } 
        
        // 比较并且赋值
        public synchronized int compareAndSwap(int exceptValue, int newValue) {
            if (exceptValue == value) {
                value = newValue;
            }
            return newValue;
        } 
        
        // 判断是否成功赋值
        public synchronized boolean compareAndSet(int exceptValue, int newValue) {
            return value == compareAndSwap(exceptValue, newValue);
        }
    }
    

    总结:原子变量:在 java.util.concurrent.atomic 包下提供了一些原子变量。

        1. volatile 保证内存可见性
        2. CAS(Compare-And-Swap) 算法保证数据变量的原子性
            CAS 算法是硬件对于并发操作的支持
            CAS 包含了三个操作数:
            ①内存值  V
            ②预估值  A
            ③更新值  B
            当且仅当 V == A 时, V = B; 否则,不会执行任何操作。
    

    相关文章

      网友评论

          本文标题:005--原子变量-CAS算法

          本文链接:https://www.haomeiwen.com/subject/weqjrftx.html