Java 如果修改变量以引用不同的原子,那么更新是否可见?
如果我在课堂上做这样的事情-Java 如果修改变量以引用不同的原子,那么更新是否可见?,java,Java,如果我在课堂上做这样的事情- private AtomicLong count = new AtomicLong(0); 然后在一个方法中,我这样做- count = new AtomicLong(1); // will this update is going to be visible to other threads 我很困惑,因为AtomicLong是@ThreadSafe您完全没有理解AtomicLong的要点 AtomicLong提供了以线程安全方式操作它的方法。 用新实例替换
private AtomicLong count = new AtomicLong(0);
然后在一个方法中,我这样做-
count = new AtomicLong(1); // will this update is going to be visible to other threads
我很困惑,因为
AtomicLong
是@ThreadSafe
您完全没有理解AtomicLong
的要点
AtomicLong
提供了以线程安全方式操作它的方法。用新实例替换您的实例将绕过所有这些 您应该将所有
AtomicLong
variablesfinal
设置为防止出现这种情况
您还需要确保不要尝试读取相同的值两次,因为其他线程可能会在读取之间更改该值。有关线程安全代码的更多信息,请参阅。我认为您误解了为什么
AtomicLong
是线程安全的。线程安全意味着在调用其方法时不需要外部同步。换句话说,所有线程都将看到存储在其中的long变量的正确值
使用
new
操作符时,您将创建该类的新实例,这样一个线程可能会看到初始声明中的值,而另一个线程可能会看到新值。如果销毁实例并创建新实例,实例如何保证线程安全?事实上,正是这个例子保证了。。。不是这个班
实际上这会破坏线程的安全性,因为两者之间没有区别
private AtomicLong count = new Long(0);
count = new AtomicLong (1);
及
因为您正在更改实例
AtomicLong
只有在保留实例的情况下才能保证线程安全。因此,你应该做:
count.incrementAndGet()
或
从而保持实例和线程的安全性
count.incrementAndGet()
count.set(1)