原子性(Atomicity)
原子性,指的是一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程打断。
i++不具有原子性
i++执行是会分为三个阶段,这三个阶段中间都可以被中断分离开.
内存到寄存器
寄存器自增
写回内存
若A、B两个线程通信,必须经过
A线程把变量从工作内存写到主内存,B线程从主内存读到自己的工作内存
每个线程都有自己的工作内存,主内存只有一个,工作内存直接不能直接通信,只能借助于主内存。
public class Test1 { private static int num = 0; // private volatile static int num = 0; private static AtomicInteger atomic = new AtomicInteger(0); public static void increase(){ for (int i = 0; i < 1000; i++) { // num ++; atomic.incrementAndGet(); } } public static void main(String[] args) { for (int i = 0; i < 20; i ++){ new Thread(()->{ increase(); }).start(); } try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(atomic.get()); } }
使用volatile关键字修饰也会出现线程安全问题,原因,volatile解决的是多线程间共享变量的可见性问题,而保证不了多线程间共享变量原子性问题。
参考资料
https://blog.csdn.net/zbw18297786698/article/details/53420780