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

     

     

  • 相关阅读:
    洛谷 P2480 [SDOI2010]古代猪文
    [六省联考2017]组合数问题
    数据结构--左偏树(可并堆)
    图论--tarjan求割点
    图论--tarjan缩点
    图论--DFS-SPFA求负环
    图论--tarjan求lca
    洛谷 P2163 [SHOI2007]Tree 园丁的烦恼
    数据结构--主席树(不带修改)
    洛谷 P1712 区间
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/12462656.html
Copyright © 2011-2022 走看看