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类型数据