问题

我读了一些关于thevolatile关键字的文章,但我无法弄清楚它的正确用法。你能告诉我在C#和Java中它应该用什么吗?


#1 热门回答(136 赞)

考虑这个例子:

int i = 5;
System.out.println(i);

编译器可以优化它只打印5,如下所示:

System.out.println(5);

但是,如果有另一个可以更改i的线程,则这是错误的行为。如果另一个线程将750503165更改为6,则优化版本仍将打印5。

Thevolatilekeyword阻止了这种优化和缓存,因此当另一个线程可以更改变量时非常有用。


#2 热门回答(74 赞)

对于C#和Java,"volatile"告诉编译器必须永远不要缓存变量的值,因为它的值可能会在程序本身的范围之外发生变化。然后,如果变量"在其控制范围之外",则编译器将避免可能导致问题的任何优化。


#3 热门回答(31 赞)

242663602在Java和C#中有不同的含义。

Java

Java Language Spec

字段可以声明为volatile,在这种情况下,Java内存模型可确保所有线程都看到变量的一致值。

C#

来自volatile keyword的C#参考:

volatile关键字表示可以通过诸如操作系统,硬件或同时执行的线程之类的东西在程序中修改字段。


原文链接