我知道在java中,如果你有多个线程访问一个未标记为volatile的变量,你可能会得到一些意想不到的行为。C#和java的volatile关键字的行为方式是一样的吗?
例子:
private boolean bExit;
while(!bExit) {
checkUserPosition();
updateUserPosition();
}
如果标记bExit变量voilatile,这将gaurantee其他线程将看到最新的值。
c#的行为方式是否一样?
更新
例如,在C#中,如果你这样做:
int counter = ...;
for(...)
{
new Thread(delegate()
{
Interlocked.Decrement(ref counter);
}
}
if(counter == 0)
{
// halt program
}
在上面,在C#中,你必须标记计数器变量挥发性或本会工作如预期?
每个* runtime *(JVM或CLR内存模型)都有一组不同的规则,并且有一些重叠。考虑在两种语言/运行时间和比较中查找“volatile”的正确(和不正确)用法。 – user2246674 2013-05-01 20:07:54
C#volatile实际上是保留在低内存应用程序中使用的,应该只能用作绝对最后的手段。下面是一些文档,以C#的形式来看看:http://msdn.microsoft.com/en-us /library/x13ttww7(v=vs.71).aspx – Nomad101 2013-05-01 20:09:08
@ Nomad101 - 我不确定低内存应用程序和volatile关键字之间存在什么关系。 – hatchet 2013-05-01 20:15:46