我希望在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关键字的情况下工作?
答案 0 :(得分:11)
volatile
关键字告诉编译器变量可以随时更改,因此它不应该优化读取和写入变量。
考虑这样的代码:
int sum;
for (var i = 0; i < 1000; i++) {
sum += x * i;
}
由于变量x
在循环内部没有变化,编译器可能会在循环外部读取变量,并在整个循环中使用相同的值。
如果使变量x
变为volatile,编译器将在每次使用变量时读取变量的值,因此如果更改其他线程中的值,则会立即使用新值。
答案 1 :(得分:2)
如果您正确使用volatile
,您的代码可以保证正常运行。如果你遗漏volatile
你的代码需要的地方,它可能在大多数时间都可以正常工作,但是不能保证,并且当它会受到最大的伤害时可能会失败。
了解线程竞争的代码如何失败或失败需要深入了解实现和平台。这并不简单,通常不值得担心。只需遵守规则,您的代码就会一直有效。