https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/volatile
volatile
关键字指示一个字段可以由多个同时执行的线程修改。 声明为 volatile
的字段不受编译器优化(假定由单个线程访问)的限制。 这样可以确保该字段在任何时间呈现的都是最新的值。
volatile
修饰符通常用于由多个线程访问、但不使用 lock 语句对访问进行序列化的字段。
volatile
关键字可应用于以下类型的字段:
-
引用类型。
-
指针类型(在不安全的上下文中)。 请注意,虽然指针本身可以是可变的,但是它指向的对象不能是可变的。 换句话说,不能声明“指向可变对象的指针”。
-
类型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。
-
具有以下基类型之一的枚举类型:byte、sbyte、short、ushort、int 或 uint。
-
已知为引用类型的泛型类型参数。
-
<xref:System.IntPtr> 和 <xref:System.UIntPtr>。
可变关键字仅可应用于类或结构的字段。 不能将局部变量声明为
volatile
。
C#中lock
1、lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下:
lock (thisLock)
{
// Critical code section
}
2、lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它就会被阻止,直到该对象被释放。也就是说在用到临界资源,确保线程可以排队进入执行临界区中的方法。
3、lock的使用场景
多个线程同时访问一个代码块,使用lock 修饰该代码块,强制多个线程进行排队,一个接一个的去访问。
通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。
希望本文所述对大家的C#程序设计有所帮助。