zoukankan      html  css  js  c++  java
  • volatile-无法保证原子性的验证

    class MyData {
        //定义初始参数,volatile关键字使用为重点
        volatile int number = 0;//初始参数叠加,此方法上添加synchronize或者锁即可以实现原子性,有种杀鸡用牛刀的感觉
    public void addPlusPlus() { number++; } //此方法保证了原子性,即在执行自加的情况下不会丢失对主线程变量的改变,即保证完整性

       //相当于定义一个初始值为零的值,保证原子性 AtomicInteger atomicInteger = new AtomicInteger(); public void addMyAtomicInteger() { atomicInteger.getAndIncrement();//相当于number++ } } public class VolatileDemo { public static void main(String[] args) { MyData myData = new MyData(); //一共20个线程,每个线程执行1000次自加操作 for (int i = 1; i <= 20; i++) { new Thread(() -> { for (int j = 1; j <= 1000; j++) { myData.addPlusPlus(); myData.addMyAtomicInteger(); } }, "XXX").start(); } //等待所有的线程执行完后,再执行主线程的打印方法 while (Thread.activeCount() > 2) { Thread.yield();//线程暂停等待 } System.out.println("多线程执行参数相加结果:int-------" + myData.number); System.out.println("多线程执行参数相加结果:atomicInteger--------" + myData.atomicInteger); } }

    代码运行结果:

    class MyData {
    //定义初始参数,volatile关键字使用为重点
    volatile int number = 0;

    //更改初始参数
    public void changeNumber() {
    this.number = 60;
    }

    //初始参数叠加
    public void addPlusPlus() {
    number++;
    }

    //此方法保证了原子性,即在执行自加的情况下不会丢失对主线程变量的改变,既保证完整性
    AtomicInteger atomicInteger = new AtomicInteger();

    public void addMyAtomicInteger() {
    atomicInteger.getAndIncrement();//相当于number++
    }
    }

    public class VolatileDemo {
    public static void main(String[] args) {
    MyData myData = new MyData();
    //一共20个线程,每个线程执行1000次自加操作
    for (int i = 1; i <= 20; i++) {
    new Thread(() -> {
    for (int j = 1; j <= 1000; j++) {
    myData.addPlusPlus();
    myData.addMyAtomicInteger();
    }
    }, "XXX").start();
    }
    //等待所有的线程执行完后,再执行主线程的打印方法
    while (Thread.activeCount() > 2) {
    Thread.yield();//线程暂停等待
    }
    System.out.println("多线程执行参数相加结果:int-------" + myData.number);
    System.out.println("多线程执行参数相加结果:atomicInteger--------" + myData.atomicInteger);
    }
  • 相关阅读:
    负载均衡
    nginx 负载均衡
    linux crontab 定时任务
    linux各种查看端口号
    MYSQL集群
    linux ntp时间同步
    【推荐】开源项目ElasticAmbari助力 ElasticSearch、Kibana、ambari服务高效运维管理
    Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    对于 评论 发送,出现网络延迟、响应慢,用户多次点击发送按钮,怎么解决只生成一次数据存入DB
    第三方授权登录
  • 原文地址:https://www.cnblogs.com/adolph2715/p/11771981.html
Copyright © 2011-2022 走看看