volatile并不能保证非原子性操作的多线程安全问题得到解决,volatile解决的是多线程间共享变量的可见性问题,而例如多线程的i++、++i,依然还是会存在多线程问题,它是无法解决了。如下:使用一个线程i++,另一个i–,最终得到的结果不为0。
i++语句执行过程
- 读取i
- i+1
- 将增值加后的i赋值给之前的i
可以看出,i++的操作是非原子性的,存在线程安全性问题。
优化方法
- 使用synchronized
- 使用原子类AtomicInteger(java.util.concurrent.atomic.AtomicInteger),它使用的是
CAS 算法,效率优于第 1 种。
注:CAS算法:内存地址V、期望值E、新值N。当操作的时候,当且仅当V上存放的值等于期望值E,则将地址V上的值赋为新值N,否则,不做任何操作,