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);
    }
  • 相关阅读:
    MySQL优化器 limit影响的case
    Innodb物理存储结构系列1
    Innodb 锁系列1 同步机制
    javascript变量作用域 全局及局部
    测试20160422
    python-推荐
    python问题:IndentationError:expected an indented block错误解决
    协同过滤(推荐方法)——数据挖掘
    教你在Excel里做GA的水平百分比图的详细步骤(图文教程)-成为excel大师(1)
    win7搭建ios开发环境
  • 原文地址:https://www.cnblogs.com/adolph2715/p/11771981.html
Copyright © 2011-2022 走看看