6

Volatile我想看看c#中关键字的实时使用。但我无法举出最好的例子。下面的示例代码在没有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 关键字的情况下工作?

4

2 回答 2

11

关键字告诉编译器volatile变量可以随时更改,因此它不应该优化变量的读取和写入。

考虑这样的代码:

int sum;
for (var i = 0; i < 1000; i++) {
  sum += x * i;
}

由于变量x在循环内不会改变,编译器可能会在循环外读取一次变量,并在整个循环中使用相同的值。

如果将变量x设为 volatile,编译器将在每次使用变量时读取该变量的值,因此如果您在不同的线程中更改该值,则新值将立即使用。

于 2012-12-03T13:00:20.720 回答
2

如果你使用volatile得当,你的代码保证可以工作。如果您遗漏了volatile代码需要它的地方,它可能大部分时间都可以正常工作,但不能保证,并且可能会在伤害最大的时候失败。

了解带有线程竞争的代码如何失败或不失败需要对实现和平台有深入的了解。这并不简单,通常不值得担心。只要遵守规则,你的代码就会一直有效。

于 2012-12-03T13:00:08.013 回答