AtomicInteger与同步的getter/setter

xxt*_*oxx 5 java concurrency multithreading

这个类是线程安全的吗?

是否有可能看到不一致的值?让我们说最初的值是80.线程1调用setA(100)并进入函数但尚未调用a.set(100)并且线程2同时调用getA().线程2有可能看到80吗?

public class A {
    private AtomicInteger a; 

    public int getA() {
        return a.get()
    }

    public void setA(int newVal){
        a.set(newVal);
    }   
}
Run Code Online (Sandbox Code Playgroud)

我知道同步它将保证线程2看到100,但不确定AtomicInteger.

Gra*_*ray 10

这个类是线程安全的吗?

是的.

线程1调用setA(100)并进入函数但尚未调用a.set(100)并且线程2同时调用getA().线程2有可能看到80吗?

是.在AtomicInteger完成内部同步volatile字段的内存屏障代码之前,竞争条件可以显示80或100.

线程1甚至可以进入AtomicInteger.set方法并且在内部字段分配之前,并且仍然可以通过get AtomicInteger.get方法返回80 .

无法保证何时在其他线程中更新值.保证的是,当get()完成时,您获得最新的同步值,并且当set()完成时,所有其他线程将看到更新.

无法保证不同线程中getter和setter调用的时间.