volatile关键字的原子性问题
在使用 int 类型进行count++操作的时候,只加个volatile关键字只能满足可见性问题,但是在某个线程进行count++操作的时候 因为这个操作不是原子性的所以会被打断,如果这个线程还没有进行写操作,然后其他线程开始执行,也进行了++操作虽然count的值在同步更新,但是在重新给count写值的时候并不会管你是不是被其他线程更改过,所以需要加上synchronized关键字来保证原子性。
下面的synchronized关键字虽然解决了问题,但是可以发现线程之间并不是严格的并性,在某个线程抢到锁之后会直接将自己的一万次加完。
Atomic原子类
Actomic关键字顾名思义就是原子的,这个类都会保证操作的原子性,还有一点很重要,就是Actomic类之间的方法并不构成原子性,例如在下面加上–操作之后,在打印中会发现并不只是只有0和1;虽然最后的结果是0但是在中间进行操作的时候两个方法之间是可以被打断的。
public class T {
//int count = 0;
AtomicInteger count = new AtomicInteger(0);
/*synchronized*/ void m(){
for (int i = 0; i <10000 ; i++) {
//count++;
count.incrementAndGet();
System.out.println(count);
//count.decrementAndGet();
}
}
public static void main(String[] args)