我想看看在c#中实时使用Volatile关键字.但我无法投射最好的例子.下面的示例代码在没有Volatile关键字的情况下工作怎么可能?
class Program { private static int a = 0,b = 0; static void Main(string[] args) { Thread t1 = new Thread(Method1); Thread t2 = new Thread(Method2); t1.Start(); t2.Start(); Console.ReadLine(); } static void Method1() { a = 5; b = 1; } static void Method2() { if (b == 1) Console.WriteLine(a); } }
在上面的代码中,我得到一个值为5.如何在不使用volatile关键字的情况下工作?
解决方法
volatile关键字告诉编译器变量可以随时更改,因此它不应该优化读取和写入变量.
考虑这样的代码:
int sum; for (var i = 0; i < 1000; i++) { sum += x * i; }
由于变量x在循环内部没有变化,编译器可能会在循环外部读取变量,并在整个循环中使用相同的值.
如果将变量x设为volatile,则编译器将在每次使用变量时读取变量的值,因此如果更改其他线程中的值,则将立即使用新值.