我找不到任何VolatileRead/write(尝试...)的示例,但仍然有疑问:何时应该使用volatile与VolatileRead?据我所知,volatile的整个目的是创建一半的屏障,因此:
1. 对于读操作,在当前操作之后读取/写入(在其他线程上),在屏障之前不会通过。因此,我们读取最新的值。
问题1:
那么为什么我需要volatileRead?看起来volatile已经做了这项工作。
另外,在C#中,所有写操作都是volatile的(不像Java),无论您是写入volatile字段还是非volatile字段 - 因此我问:为什么我需要volatileWrite?
问题2:
这是VolatileRead的实现:
1. 对于读操作,在当前操作之后读取/写入(在其他线程上),在屏障之前不会通过。因此,我们读取最新的值。
问题1:
那么为什么我需要volatileRead?看起来volatile已经做了这项工作。
另外,在C#中,所有写操作都是volatile的(不像Java),无论您是写入volatile字段还是非volatile字段 - 因此我问:为什么我需要volatileWrite?
问题2:
这是VolatileRead的实现:
[MethodImpl(MethodImplOptions.NoInlining)]
public static int VolatileRead(ref int address)
{
int num = address;
MemoryBarrier();
return num;
}
为什么要有这行代码:int num = address;
?明明已经有了参数address,它显然保存了值。
volatile
关键字只能用于字段上。如果要在多个线程之间共享非字段内存位置(比如闭包中的变量)并获得相同的语义,可以使用VolatileRead
和VolatileWrite
。请注意,这不会改变原始意思。 - anton.burger