volatile (Справочник по C#)

Ключевое слово volatile указывает, что поле может быть изменено несколькими потоками, выполняющимися одновременно. Поля, объявленные как volatile, не проходят оптимизацию компилятором, которая предусматривает доступ посредством отдельного потока. Это гарантирует наличие наиболее актуального значения в поле в любое время.

Как правило, модификатор volatile используется для поля, обращение к которому выполняется через несколько потоков без использования оператора lock для сериализации доступа.

Ключевое слово volatile можно применять к полям следующих типов.

  • Ссылочные типы.

  • Типы указателей (в небезопасном контексте). Обратите внимание, что несмотря на то, что сам указатель может быть "volatile", объект, на который он указывает, таковым быть не может. Другими словами, нельзя объявить указатель "volatile".

  • Типы, такие как sbyte, byte, short, ushort, int, uint, char, float и bool.

  • Тип перечисления с одним из следующих базовых типов: byte, sbyte, short, ushort, int или uint.

  • Параметры универсальных типов, являющиеся ссылочными типами.

  • IntPtr и UIntPtr.

Ключевое слово volatile можно применить только к полям класса или структуры. Локальные переменные не могут быть объявлены как volatile.

Пример

В следующем примере показано как объявить открытую переменную поля в качестве volatile.

    class VolatileTest
    {
        public volatile int i;

        public void Test(int _i)
        {
            i = _i;
        }
    }

В следующем примере демонстрируется создание вспомогательного или рабочего потока и использование его для выполнения обработки параллельно с основным потоком. Дополнительные сведения о многопоточности см. в разделах Управляемая поточность и Работа с потоками (C# и Visual Basic).

using System;
using System.Threading;

public class Worker
{
    // This method is called when the thread is started. 
    public void DoWork()
    {
        while (!_shouldStop)
        {
            Console.WriteLine("Worker thread: working...");
        }
        Console.WriteLine("Worker thread: terminating gracefully.");
    }
    public void RequestStop()
    {
        _shouldStop = true;
    }
    // Keyword volatile is used as a hint to the compiler that this data 
    // member is accessed by multiple threads. 
    private volatile bool _shouldStop;
}

public class WorkerThreadExample
{
    static void Main()
    {
        // Create the worker thread object. This does not start the thread.
        Worker workerObject = new Worker();
        Thread workerThread = new Thread(workerObject.DoWork);

        // Start the worker thread.
        workerThread.Start();
        Console.WriteLine("Main thread: starting worker thread...");

        // Loop until the worker thread activates. 
        while (!workerThread.IsAlive) ;

        // Put the main thread to sleep for 1 millisecond to 
        // allow the worker thread to do some work.
        Thread.Sleep(1);

        // Request that the worker thread stop itself.
        workerObject.RequestStop();

        // Use the Thread.Join method to block the current thread  
        // until the object's thread terminates.
        workerThread.Join();
        Console.WriteLine("Main thread: worker thread has terminated.");
    }
    // Sample output: 
    // Main thread: starting worker thread... 
    // Worker thread: working... 
    // Worker thread: working... 
    // Worker thread: working... 
    // Worker thread: working... 
    // Worker thread: working... 
    // Worker thread: working... 
    // Worker thread: terminating gracefully. 
    // Main thread: worker thread has terminated.
}

Спецификация языка C#

Дополнительные сведения см. в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Ключевые слова C#

Модификаторы (Справочник по C#)

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Справочник по C#