Java 在哪种情况下';需要在原子字段中使用volatile关键字吗?
在哪些情况下,需要将volatile关键字与原子字段一起使用?或者如果字段是原子***关键字volatile是冗余的 谢谢你什么都不要 或者如果字段是原子***关键字volatile是冗余的 冗余或两者都不是正确的工具,具体取决于情况。无任何问题 或者如果字段是原子***关键字volatile是冗余的Java 在哪种情况下';需要在原子字段中使用volatile关键字吗?,java,multithreading,atomic,race-condition,volatile,Java,Multithreading,Atomic,Race Condition,Volatile,在哪些情况下,需要将volatile关键字与原子字段一起使用?或者如果字段是原子***关键字volatile是冗余的 谢谢你什么都不要 或者如果字段是原子***关键字volatile是冗余的 冗余或两者都不是正确的工具,具体取决于情况。无任何问题 或者如果字段是原子***关键字volatile是冗余的 根据情况,冗余或两者都不是正确的工具。确实没有理由使原子字段不稳定。原子场应该是最终的,否则使用它们就毫无意义了。如果你声明一个原子整数,比如 AtomicInteger integer = ne
根据情况,冗余或两者都不是正确的工具。确实没有理由使原子字段
不稳定。原子场应该是最终的,否则使用它们就毫无意义了。如果你声明一个原子整数,比如
AtomicInteger integer = new AtomicInteger(420);
可以通过其方法(如incrementAndGet
)以原子方式访问它,但仍然可以通过直接分配字段来绕过它们,即分配一个新值,如integer=new AtomicInteger(10)
而不是integer.set(10)
这首先破坏了使用原子整数的全部目的。因此,应将其宣布为最终决定
final AtomicInteger integer = new AtomicInteger(420);
这确保了它只能使用其原子方法进行更改,而不能通过重新分配变量进行更改。当变量是final
时,将其声明为volatile
是毫无意义的-Java甚至不允许您这样做。因此,不存在将两者结合使用的实际场景。确实没有理由使原子场波动。原子场应该是最终的,否则使用它们就毫无意义了。如果你声明一个原子整数,比如
AtomicInteger integer = new AtomicInteger(420);
可以通过其方法(如incrementAndGet
)以原子方式访问它,但仍然可以通过直接分配字段来绕过它们,即分配一个新值,如integer=new AtomicInteger(10)
而不是integer.set(10)
这首先破坏了使用原子整数的全部目的。因此,应将其宣布为最终决定
final AtomicInteger integer = new AtomicInteger(420);
这确保了它只能使用其原子方法进行更改,而不能通过重新分配变量进行更改。当变量是final
时,将其声明为volatile
是毫无意义的-Java甚至不允许您这样做。因此,不存在将两者结合使用的实际场景。差异在Java并发性实践
一书中很好地提到:
- Volatile提供内存可见性保证
- 原子变量提供内存可见性和原子性
因此,无需将volatile关键字与AtomicXXX变量一起使用。差异在Java并发性实践中得到了很好的体现。
一书:
- Volatile提供内存可见性保证
- 原子变量提供内存可见性和原子性
因此,无需将volatile关键字与AtomicXXX变量一起使用。如果需要修改引用,可能会很有用,但这并不常见。如果需要修改引用,可能会很有用,但这并不常见。