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);
    }
  • 相关阅读:
    UVa 820 因特网带宽(最大流)
    UVa 1001 奶酪里的老鼠(Dijkstra或Floyd)
    UVa 821 网页跳跃(Floyd)
    UVa 11624 大火蔓延的迷宫
    UVa 10881 蚂蚁
    UVa 11300 分金币
    UVa 11729 突击战
    《额尔古纳河右岸》读书笔记
    HDU 1083 Courses(二分图匹配模板)
    UVa 10618 跳舞机
  • 原文地址:https://www.cnblogs.com/adolph2715/p/11771981.html
Copyright © 2011-2022 走看看