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();
    
        }
    }
    使用原子变量

     

     

  • 相关阅读:
    Vue3.0 是如何变得更快的?
    阿里云 Centos7 安装mongodb
    ASP.Net Core5.0 EF Core使用记录
    MongoDB批量更新|按条件更新SQL|批量删除某个字段
    Layui单元格编辑获取修改前的值
    判断字符串出现的多个位置
    原生JavaScript的DOM操作汇总
    @Value值为null、#和$的区别
    Dubbo推荐用法
    Dubbo 服务化最佳实践
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/12462656.html
Copyright © 2011-2022 走看看