Volatile 类

定义

包含用于执行可变内存操作的方法。

public ref class Volatile abstract sealed
public static class Volatile
type Volatile = class
Public Class Volatile
继承
Volatile

注解

在多处理器系统上,由于编译器或处理器中的性能优化,当多个处理器在同一内存上运行时,常规内存操作可能会重新排序。 易失性内存操作可防止对操作进行某些类型的重新排序。 易失性写入操作可防止在易失写入后重新排序早期内存操作。 易失性读取操作可防止在易失读取之前重新排序以后的内存操作。 这些操作可能涉及某些处理器上的内存屏障,这可能会影响性能。

备注

  • 在多处理器系统上,不能保证易失性读取操作获取任何处理器写入该内存位置的最新值。 同样,易失性写入操作不保证写入的值会立即对其他处理器可见。
  • 在单处理器系统上,易失性读取和写入可确保值读取或写入内存,而不是在处理器寄存器中) 缓存 (。 因此,可以使用这些操作来同步对可由另一个线程或硬件更新的字段的访问。

易失性内存操作适用于同步的特殊情况,其中正常锁定不是可接受的替代方法。 在正常情况下,C# lock 语句、Visual BasicSyncLock语句和Monitor类提供了同步数据访问的最简单和最不容易出错的方法,并且该Lazy<T>类提供了一种简单的方法来编写延迟初始化代码,而无需直接使用双重检查的锁定。

这些 Volatile.ReadVolatile.Write 方法支持语言不支持的功能。 例如:

  • 某些语言(如Visual Basic)无法识别易失性内存操作的概念。 该 Volatile 类提供此类语言中的该功能。

    备注

    调用其中一种方法仅影响单个内存访问。 若要为字段提供有效的同步,必须使用该 Volatile.Read 字段的所有访问权限和 Volatile.Write

  • 在 C# 中 volatile ,对字段使用修饰符可确保对该字段的每个访问都是易失性内存操作,但 volatile 修饰符不能应用于数组元素。 这些 Volatile.Read 元素和 Volatile.Write 方法可用于数组元素。

方法

Read(Boolean)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(Byte)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(Double)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(Int16)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(Int32)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(Int64)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(IntPtr)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(SByte)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(Single)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(UInt16)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(UInt32)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(UInt64)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read(UIntPtr)

读取指定字段的值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Read<T>(T)

从指定的字段读取对象引用。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。

Write(Boolean, Boolean)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(Byte, Byte)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(Double, Double)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(Int16, Int16)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(Int32, Int32)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(Int64, Int64)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(IntPtr, IntPtr)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(SByte, SByte)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(Single, Single)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(UInt16, UInt16)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(UInt32, UInt32)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(UInt64, UInt64)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write(UIntPtr, UIntPtr)

将指定的值写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

Write<T>(T, T)

将指定的对象引用写入指定字段。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

适用于

另请参阅