Dan*_* S. -2 java multithreading volatile
由于许多误解,我从头开始重新阐述了这个问题。提问的初衷没有改变。许多评论仍然引用旧的问题文本。
有关文档volatile
指出,它确保其他线程以一致的方式看到内存更新。然而,volatile
很少使用。
据我所知,synchronized
块的目的是使线程不同时执行这些关键部分。是否也会synchronized
像其他线程一样导致一致的内存更新volatile
?
当发生在锁定部分内时,Java 中的线程之间的所有内存都会一致更新,这真的是真的吗?
简短回答:
是的。
长答案:
double
在 JVM 中,引用类型和除之外的所有原始类型的赋值long
都是“原子的”。即任何线程要么看到一个值,要么看到另一个值,但永远不会看到一半更新的值。因此,您甚至可以说内存“一致”更新,而不执行任何操作(这方面有一些微妙之处,因此不要尝试实际使用此特性!众所周知,它用于实现String#hashCode
)。
但是,如果没有volatile
更改,可能不会立即可见,就像您所说的那样(“立即”有点误导。有关更多详细信息,请参阅此答案)。synchronized
关键字确实会使更改以相同的方式立即可见volatile
。那么有什么意义volatile
。
基本上你可以volatile
使用synchronized
. 所以volatile
并没有给你可以做的新事情。但是,它仍然很有用,因为它可以避免锁定。性能通常会更好volatile
(代价是功能较少;synchronized
可以做所有volatile
事情,但反之则不然),而且也不存在死锁危险。IMO 如果你能逃脱惩罚volatile
,你应该使用volatile
. 但有很多人不同意,认为你应该随处使用synchronized
。