zoukankan      html  css  js  c++  java
  • JAVA JUC 原子变量

    volatitle声明的变量不具备原子性.即,当执行++ --这样的操作时,由于不是原子操作,所以还存在线程安全问题.

        i = 10;
        i = i++;
        i=? ==>10
    //解释:
        tmp=i
        i=i++
        i=tmp
    class atoT implements Runnable{
        private volatile int s = 0;
    
        @Override
        public void run() {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(getS());
        }
        private int getS(){
            return s++;
        }
    
    }
    public class atomicTest {
        public static void main(String[] args) {
            atoT at = new atoT();
            for(int i=0;i<10;i++)
                new Thread(at).start();
    
        }
    }
    View Code

    我们可以利用 java.util.concurrent.atomic下的原子变量

    原子变量使用了

      1 volatile保证了内存的可见性

      2 使用CAS (compare-and-swap)算法保证了数据的原子性

        V主存值

        A 预估值

        B 更新值

        当且仅当 V==A时,V更新为B

    class atoT implements Runnable{
        private AtomicInteger s = new AtomicInteger(0);
    
        @Override
        public void run() {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(getS());
        }
        private int getS(){
            return s.getAndIncrement();
        }
    
    }
    public class atomicTest {
        public static void main(String[] args) {
            atoT at = new atoT();
            for(int i=0;i<10;i++)
                new Thread(at).start();
    
        }
    }
    使用原子变量

     

     

  • 相关阅读:
    Win10下 Docker Flask实例
    4.1 线性映射的概念
    桥梁的基本组成和分类
    Qt5字符串编码转换学习
    在右键菜单中添加用Jupyter Notebook打开
    左右手(直角)坐标系叉乘计算公式
    __new__方法与单键实例
    向量组的秩
    从线性组合的角度理解三维运算
    Hexo使用小结
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/12462656.html
Copyright © 2011-2022 走看看