挥发性和原子性.这有什么意义吗?



我注意到所有关于原子写的例子都没有volatile关键字。当然是对的。

如果我在原子链接中添加volatile修饰符会发生什么?

public class VolatilAtomic {
    volatile AtomicInteger atomicInteger = new AtomicInteger();
}

 public class VolatilAtomic {
         AtomicInteger atomicInteger = new AtomicInteger();
    }

?

如果您在方法中重新分配变量:atomicInteger = new AtomicInteger(),则会有所不同,在这种情况下,将变量标记为volatile将保证其他线程可以看到该赋值。

但是,如果您只使用与您的类的每个实例创建的AtomicInteger实例,并且从不重新分配它,那么volatile是不必要的。

一般来说,final会更合适。

修饰符的重要之处在于它改变的是引用,而不是被引用的对象。例如

final int[] a = { 0 };
a[0] = 5;    // ok, not final
a = b;       // not ok as it is final 
同样

volatile int[] a = { 0 };
a[0] = 5;    // not a volatile write
a = b;       // volatile write.

两者都提供相同的可见性,但只有AtomicInteger提供原子性

相关内容

  • 没有找到相关文章

最新更新