20万,而是小于20万,原因就是在运行的过程中,多线程出现了数据竞争和内存一致性的问题:
a的值为1
t1线程获取到a的值为1
t2线程获取到a的值为1
t1将值更新为2
t2将值更新为2
......重点在于以下几点
1:共享变量的可见性,如果修改了变量,在其他线程能马上获取到最新的值,也就是线程本地内存不要缓存旧值
2:共享变量的线程安全性,多个线程访问同一个变量时,如果不用考虑这些线程在运行时环境下的调度和交替执行...3:原子操作,如果对一个变量的操作是原子性的(不会出现先获取,再加值),就不会出现错误的结果
4:同步机制,如果多线程在同一时间只会有一个线程在操作变量,就不会出现线程共享问题
CAS
CAS的全称为Compare-And-Swap...改为AtomicInteger类型,在每次+1时通过CAS方式+1,判断如果旧值不对,则循环更新,直到更新成功
可以看出,CAS的更新需要判断成功和失败,如果目的就是更新,那失败之后就还得重复的去尝试更新...CAS ABA问题
ABA问题是指在进行CAS操作时,如果一个变量的值先被修改为B,再被修改回A,此时CAS操作会认为该变量的值没有被修改过,从而可能导致出错。