sha*_*awn 53 java multithreading volatile thread-safety
intJava中的volatile是否是线程安全的?也就是说,可以安全地读取和写入而不锁定吗?
Jon*_*eet 66
是的,您可以从中读取并安全地写入它 - 但是您不能执行任何复合操作,例如安全地增加它,因为这是一个读取/修改/写入循环.还有关于它如何与访问其他变量进行交互的问题.
volatile的确切性质令人困惑(请参阅JLS的内存模型部分以获取更多详细信息) - 我个人通常会使用它AtomicInteger作为一种更简单的方法来确保我做对了.
Java 中对 volatile int 的访问将是线程安全的。当我说访问时,我指的是对其进行单元操作,例如 volatile_var = 10 或 int temp = volatile_var (基本上是使用常量值进行写入/读取)。java 中的 volatile 关键字确保了两件事:
然而,Jon Skeet 正确地提到,在非原子操作 (volatile_var = volatile + 1) 中,不同的线程可能会得到意外的结果。