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

     

     

  • 相关阅读:
    /sbin/nologin 和 /bin/false 的区别
    lesson
    df 命令详解
    课后习题-7 阶段汇总
    javascript Window Navigator
    javascript 正则表达式
    linux crontab 的使用
    linux环境变量
    linux第一个C语言和sh脚本
    linux 文件常用操作
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/12462656.html
Copyright © 2011-2022 走看看