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

     

     

  • 相关阅读:
    链表
    链式学习法:提升技术深度
    数组
    写点什么
    7 天掌握算法面试必考知识点: 作业安排及如何提交
    创建Mac OS root账户
    正则表达式匹配及替换
    Xcode 10 之New Build System & Legacy Build System 旧版构建系统
    性能指标:TPS、QPS、RT、吞吐量
    Objective-C和Swift语言特性
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/12462656.html
Copyright © 2011-2022 走看看