Java似乎支持long类型的volatile字段,而C#没有 - 这背后的原因是什么?

kit*_*une 10 c# java multithreading volatile

任何人都可以向我解释这两种不同方法的优点和缺点是什么?

eri*_*son 8

当Java doublelongJava中volatile,Java语言规范的第17.7节要求它们以原子方式读写.当它们不易变时,它们可以用多个操作编写.例如,这可能导致包含新值的long的高32位,而低32位仍然包含旧值.

原子读写更容易让程序员推理和编写正确的代码.但是,在某些环境中,对原子操作的支持可能会给VM实施者带来负担.


Che*_*eso 7

我不知道为什么volatile不能在C#中应用于64位整数,但你可以使用Thread.VolatileWrite在C#中做你想做的事情.volatile关键字只是这次调用的语法糖.

摘抄:

注意:在C#中,在字段上使用volatile修饰符可确保对该字段的所有访问都使用Thread.VolatileRead或Thread.VolatileWrite.

语法糖(关键字)适用于32位整数,但您可以使用64位整数的实际方法调用.


Mar*_*ell 5

我想这归结为内存模型可以保证的.我不太了解CLI内存模型(C#必须使用),但我知道它将保证32位......但不是64位(虽然它可以保证x64上的64位引用 - 完整规则在ECMA 334v4的第17.4.3节中.所以它不可能volatile.你仍然有Interlocked方法,但(如long Interlocked.Exchange(ref long,long)long Interlocked.Increment(ref long)等).

  • 无论底层平台是什么,CLI都应该可以工作,所以它不希望做出依赖于你正在运行的东西的承诺. (3认同)