可变关键字线程安全

1 java multithreading volatile

在谷歌搜索了很多之后,我发现了 volatile 关键字的多个定义。

概念一:

一些网站说,它是线程安全的,因为线程作用于存储 volatile 关键字的主内存,并在不将其拉到线程堆栈空间的情况下对其进行修改。

概念2:

有人说,它不是线程安全的,因为它会导致线程竞争条件。由于,线程将 volatile 变量拉到堆栈空间,修改它并立即将其放回主内存。但是,在另一个线程之间可以对 volatile 变量采取行动并采取行动。因此,通过这种方式,某些值会丢失。

哪个概念是正确的?

Tom*_*ski 6

volatile 本身既不是线程安全的,也不是非线程安全的。

volatile保证单个字段的原子性,因此它可用于单线程安全读取或单线程安全写入。

然而,如果你想执行一个由读和写组成的线程安全操作(作为一个整体来理解),这里volatile单独不能提供线程安全,因为volatile只保证单个操作(读或写)的原子性。

总结:

  • 如果您有一个字段并且您想确保如果一个线程写入它,其他线程可以立即读取写入的值 -volatile就足够了(没有volatile,其他线程甚至可能永远不会看到写入的值)
  • 如果您有一个需要先读取然后才写入的字段(基于您刚刚读取的值,因此在此之间volatile不会发生对该值的操作),这还不够;相反,您可以使用: