说一个易变的原语是正确的:
1)需要非原子操作的同步 2)不需要原子操作的同步,如下所示:
volatile bool selector;
selector = true;
答案 0 :(得分:1)
如果您只是重新分配volatile变量,则不应要求同步。这就是他们背后的想法。
实际上,在这种情况下,它甚至不必是易失性的,因为新值true
不依赖于selector
的旧值所以如果它已经是无关紧要的由另一个线程改变。
答案 1 :(得分:1)
根据Oracle Java documentation:
对于声明为volatile的所有变量,读取和写入都是原子的 (包括长变量和双变量)。
使用volatile声明的值/目的与使用synchronize
块相同。所以不,您不需要同步访问易失性变量
就两者之间的权衡而言,同样的文件说:
使用简单的原子变量访问比访问更有效 这些变量通过同步代码,但需要更多的关注 程序员避免内存一致性错误。是否额外 努力是值得的,取决于的大小和复杂性 应用