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);
}
posted @ 2019-10-31 16:27  故城归人  阅读(167)  评论(0编辑  收藏  举报