volatile
是java种用于多线程安全问题的关键字。
- 保证多线程间内存可见性
每个线程都有拷贝一个变量副本,线程修改值时只会修改线程本地的副本值。其他线程并不知道值已经被修改。
加入volatile修饰后,线程本地副本的值不在有效,强制线程从堆内存中拿值。
- 防止指令重排
在JVM执行代码的时候会优化指令,那么就可能打乱原有的执
行顺序。可能一个值还没有被初始化,另外的线程已经在使用这个值。
atomic原子变量
所有操作都具有原子性的变量。
解决ABA问题
数据被从A修改为B又修改为A,A->B->A。如果一个线程前后两次读取数据,都是A,实际上脏读/多线程安全问题已经发生。
CAS算法,compareAndSwap,对数据的每次操作都记录下时间戳,只有当时间戳和数据一样时,才会进行操作。
和synchronized不同
synchronized也可以实现原子操作, 它是对资源加锁,同一时间内,只有抢占到锁资源的才能操作数据。
synchronized获取锁释放锁需要资源,如果抢占不到还会阻塞。
如果只是针对变量的原子操作,那么就使用原子变量。