package now;
import java.util.concurrent.TimeUnit;
class Student{
volatile int age = 0;
//此时的age加了volatile关键字修饰,volatile不保证原子性
public void addPlusPlus() {
this.age++;
}
}
/**
* 验证volatile的不保证原子性
* 原子性的意思是不可分割,完整性,也就是某个线程在执行某个具体业务时,中间不可以被加塞或者被分割,需要具体完整
* 要么同时成功,要么同时失败
*/
public class VolatileTest {
public static void main(String[] args) { //main是一切方法的运行入口
Student student = new Student();
for (int i = 0; i < 20; i++) {
new Thread(() -> {
for (int j = 0; j < 10000; j++) {
student.addPlusPlus();
}
},String.valueOf(i)).start();
}
//需要等待上面二十个线程全部写完,再执行main线程
while(Thread.activeCount() > 2){
//当前线程数大于2时,main线程让出
Thread.yield();
}
System.out.println(student.age);
}
}
20个线程,每个线程重复10000次age++;
如果有原子性,结果应该为200000

如何解决?
1.加sync(杀鸡用牛刀)
2.AtomicInteger类型数据

本文探讨了Java中volatile关键字的不保证原子性,并通过例子展示了20个线程并发增加Student对象age变量的场景。讲解了如何通过AtomicInteger和同步(synchronized)来确保原子性,以达到预期的200000结果。
5131

被折叠的 条评论
为什么被折叠?



