Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果修改变量以引用不同的原子,那么更新是否可见?_Java - Fatal编程技术网

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
variables
final
设置为防止出现这种情况


您还需要确保不要尝试读取相同的值两次,因为其他线程可能会在读取之间更改该值。有关线程安全代码的更多信息,请参阅。

我认为您误解了为什么
AtomicLong
是线程安全的。线程安全意味着在调用其方法时不需要外部同步。换句话说,所有线程都将看到存储在其中的long变量的正确值


使用
new
操作符时,您将创建该类的新实例,这样一个线程可能会看到初始声明中的值,而另一个线程可能会看到新值。

如果销毁实例并创建新实例,实例如何保证线程安全?事实上,正是这个例子保证了。。。不是这个班

实际上这会破坏线程的安全性,因为两者之间没有区别

private AtomicLong count = new Long(0);
count = new AtomicLong (1); 

因为您正在更改实例

AtomicLong
只有在保留实例的情况下才能保证线程安全。因此,你应该做:

count.incrementAndGet()

从而保持实例和线程的安全性

count.incrementAndGet()
count.set(1)