bloquear Instrução (Referência C#)

O lock palavra-chave marca um bloco de instrução como uma seção crítica, obtendo o bloqueio de exclusão mútua para um determinado objeto, executar uma instrução e, em seguida, liberar o bloqueio. Esta instrução assume a forma a seguir:

Object thisLock = new Object();
lock (thisLock)
{
    // Critical code section.
}

Para obter mais informações, consulte Segmento de sincronização (C# e Visual Basic).

Comentários

O lock palavra-chave garante que um segmento não inserir uma seção crítica do código enquanto outro thread está na seção crítica. Se outro thread tenta inserir um código bloqueado, ele aguardará, bloquear, até que o objeto seja liberado.

A seção Threading (C# e Visual Basic) discute threading.

O lock chamadas de palavra-chave Enter no início do bloco e Exit no final do bloco.

Em geral, evite o bloqueio em um public tipo, ou instâncias além de controle. do código As construções comuns lock (this), lock (typeof (MyType)), e lock ("myLock") violam essa diretriz:

  • lock (this)é um problema se a instância pode ser acessada publicamente.

  • lock (typeof (MyType))é um problema se MyType for publicamente acessível.

  • lock("myLock")é um problema porque a qualquer outro código no processo usando a mesma cadeia, irá compartilhar o mesmo bloqueio.

Prática recomendada é definir um private o objeto para bloquear, ou um private static a variável de objeto para proteger os dados comuns a todas as instâncias.

Exemplo

O exemplo a seguir mostra um simples uso de threads sem bloqueio no C#.

    //using System.Threading;

    class ThreadTest
    {
        public void RunMe()
        {
            Console.WriteLine("RunMe called");
        }

        static void Main()
        {
            ThreadTest b = new ThreadTest();
            Thread t = new Thread(b.RunMe);
            t.Start();
        }
    }
    // Output: RunMe called

O exemplo a seguir usa os threads e lock. Desde que o lock declaração estiver presente, o bloco de declaração é uma seção crítica e balance nunca se tornará um número negativo.

    // using System.Threading;

    class Account
    {
        private Object thisLock = new Object();
        int balance;

        Random r = new Random();

        public Account(int initial)
        {
            balance = initial;
        }

        int Withdraw(int amount)
        {

            // This condition will never be true unless the lock statement
            // is commented out:
            if (balance < 0)
            {
                throw new Exception("Negative Balance");
            }

            // Comment out the next line to see the effect of leaving out 
            // the lock keyword:
            lock (thisLock)
            {
                if (balance >= amount)
                {
                    Console.WriteLine("Balance before Withdrawal :  " + balance);
                    Console.WriteLine("Amount to Withdraw        : -" + amount);
                    balance = balance - amount;
                    Console.WriteLine("Balance after Withdrawal  :  " + balance);
                    return amount;
                }
                else
                {
                    return 0; // transaction rejected
                }
            }
        }

        public void DoTransactions()
        {
            for (int i = 0; i < 100; i++)
            {
                Withdraw(r.Next(1, 100));
            }
        }
    }

    class Test
    {
        static void Main()
        {
            Thread[] threads = new Thread[10];
            Account acc = new Account(1000);
            for (int i = 0; i < 10; i++)
            {
                Thread t = new Thread(new ThreadStart(acc.DoTransactions));
                threads[i] = t;
            }
            for (int i = 0; i < 10; i++)
            {
                threads[i].Start();
            }
        }
    }

Especificação da linguagem C#

Para obter mais informações, consulte C# Language Specification A especificação de linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

C# Keywords

Palavras-chave de instrução (referência de C#)

MethodImplAttributes

Mutex

Segmento de sincronização (C# e Visual Basic)

Conceitos

C# Programming Guide

Threading (C# e Visual Basic)

Monitores

Operações interligadas

AutoResetEvent

Outros recursos

C# Reference