https://blog.csdn.net/zbw18297786698/article/details/53420780
volaitile
volatile关键字解决的是多线程间共享变量的可见性问题,而保证不了多线程共享变量原子性问题,对于多线程的i++、++i依然会存在多线程问题,volatile是无法解决的。
Thred1 Thread2:
r1 = i; r3 = i; //读取i值
r2 = r1+1; r4 = r3+1; //i值加1
i = r2; i = r4; //写回到i
这样会造成的问题就是r1、r3读到的值都是0,最后两个线程都将1写入i,最后i等于1,但是却进行了两次自增操作。
所以volatile和没加volatile都无法解决非原子操作的线程同步问题。
解决方法
1.使用循环CAS,实现i++原子操作
使用java.util.concurrent.atomic包来提供线程安全的原子操作类。这些原子操作类都是用CAS来实现,i++的原子性操作。
返回的是旧值,先自增再获取。
public final int getAndIncrement(){
for(;;){
int currrent = get();
int next = current+1;
if(compareAndSet(current,next)){
return current;
}
}
}
2.使用锁机制
Lock()、sychronized
锁的都是类。