原子性
- 所谓原子性是指在一次操作或者多次操作中,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行多个操作是一个不可以分割的整体
示例
1 | package com.yishan.yuanzi; |
测试
1 | package com.yishan.yuanzi; |
结论
- volatile关键字不可以保证原子性,但是synchronized同步代码块可以保证原子性
AtomicInteger_原子性
1 | package com.yishan.atomic; |
AtomicInteger_原理
自旋+CAS算法
- 在修改共享数据的时候,把原来的旧值记录下来了
- 如果现在内存中的值和原来的旧值一样,证明没有其他线程操作过内存值,则修改成功
- 如果现在内存中的值和原来的旧值不一样了,证明已经有其他线程操作过内存值了,则修改失败,需要重新获取现在最近的值,再次进行操作,这个重新获取就是自旋。
AtomicInteger_源码解析
1 | //先自增,然后获取自增后的结果 |
synchronized和CAS的区别
- 相同点:在多线程情况下,都可以保证共享数据的安全性。
- 不同点:
- synchronized总是从最坏的角度出发,认为每次获取数据的时候,别人都有可能修改,所以在每次操作共享数据之前,都会上锁。(悲观锁)
- CAS是从乐观的角度出来,假设每次获取数据别人都不会修改,所以不会上锁。只不过在修改共享数据的时候,会检查一下,别人有没有修改过这个数据。如果别人修改过,那么我再次获取现在最新的值。
- 如果别人没有修改过,那么我现在直接修改共享数据的值。(乐观锁)