volatile 关键字指示一个字段可以由多个同时执行的线程修改。 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。 这样可以确保该字段在任何时间呈现的都是最新的值。

volatile 修饰符通常用于由多个线程访问但不使用 lock 语句对访问进行序列化的字段。

volatile 关键字可应用于以下类型的字段:

  • 引用类型。

  • 指针类型(在不安全的上下文中)。 请注意,虽然指针本身可以是可变的,但是它指向的对象不能是可变的。 换句话说,您无法声明“指向可变对象的指针”。

  • 类型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。

  • 具有以下基类型之一的枚举类型:byte、sbyte、short、ushort、int 或 uint。

  • 已知为引用类型的泛型类型参数。

  • IntPtr 和 UIntPtr

可变关键字仅可应用于类或结构字段。 不能将局部变量声明为 volatile

 1 using System;
2 using System.Threading;
3
4 public class Worker
5 {
6 // This method is called when the thread is started.
7 public void DoWork()
8 {
9 while (!_shouldStop)
10 {
11 Console.WriteLine("Worker thread: working...");
12 }
13 Console.WriteLine("Worker thread: terminating gracefully.");
14 }
15 public void RequestStop()
16 {
17 _shouldStop = true;
18 }
19 // Keyword volatile is used as a hint to the compiler that this data
20 // member is accessed by multiple threads.
21 private volatile bool _shouldStop;
22 }
23
24 public class WorkerThreadExample
25 {
26 static void Main()
27 {
28 // Create the worker thread object. This does not start the thread.
29 Worker workerObject = new Worker();
30 Thread workerThread = new Thread(workerObject.DoWork);
31
32 // Start the worker thread.
33 workerThread.Start();
34 Console.WriteLine("Main thread: starting worker thread...");
35
36 // Loop until the worker thread activates.
37 while (!workerThread.IsAlive) ;
38
39 // Put the main thread to sleep for 1 millisecond to
40 // allow the worker thread to do some work.
41 Thread.Sleep(1);
42
43 // Request that the worker thread stop itself.
44 workerObject.RequestStop();
45
46 // Use the Thread.Join method to block the current thread
47 // until the object's thread terminates.
48 workerThread.Join();
49 Console.WriteLine("Main thread: worker thread has terminated.");
50 }
51 // Sample output:
52 // Main thread: starting worker thread...
53 // Worker thread: working...
54 // Worker thread: working...
55 // Worker thread: working...
56 // Worker thread: working...
57 // Worker thread: working...
58 // Worker thread: working...
59 // Worker thread: terminating gracefully.
60 // Main thread: worker thread has terminated.
61 }



posted on 2011-12-26 11:45  risan  阅读(522)  评论(0编辑  收藏  举报