保证自增操作的原子性
解决volatile不能保证原子性操作的方案:
保证number自增操作原子性
保证 number 自增操作的原子性:
1、线程A读取到的number 为 5;
2、线程B读取到的number 为 5;
3、线程B 执行加1 操作, number ++
4、线程B写入最新的 number 为 3 中的 5+ 1 = 6;
5、线程A 执行加 1 操作没有向主内存读取共享变量,故 依旧是 由 原始变量 number = 5 开始 加 1 操作,即 此时 number = 5+ 1 ;
6、线程 A 写入最新的 number 值 ,此时内存中的 只是 将 线程B 的 6 改成了 线程 A 的6 ,实际上只是同值的 覆盖,而非 递增
保证number自增操作的原子性:
使用synchronized关键字
使用ReentrantLock
使用AtomicInteger
num++不是原子操作,原子操作意为(所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch --百科),volatile能保证可见性,但是在多线程调度时 num++ 被拆分为
1)从主存中读取num值;
2) i = num + 1;
3) 写回i 到主存的num
三步
解决number++不是原子性的方案
A线程读取主内存number值为5
B线程读取主内存number值为5
A线程执行完number++操作将6强制刷新到主内存中
B线程执行完number++操作将6强制刷新到主内存中
两个线程执行了俩次number++,看结果的话只增加了1
反反复复付付付
啊啊啊啊啊啊
number自增操作的原子性
保证原子性的几个方案
num++不是原子操作,原子操作意为(所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch --百科),volatile能保证可见性,但是在多线程调度时 num++ 被拆分为
1)从主存中读取num值;
2) i = num + 1;
3) 写回i 到主存的num
三步
保证原子性三种方案。