bloquear de demonstrativo (referência translation from VPE for Csharp)

The lock palavra-chave marca um bloco sistema autônomo uma seção crítica sistema autônomo adquirir o bloquear de exclusão mútua para um determinado objeto, executando uma demonstrativo e, em seguida, liberar o bloquear. Essa demonstrativo assume a forma a seguir:

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

Para obter mais informações, consulte Como: Declarar um evento em uma interface e implementá-lo em uma classe (Guia de programação C#).

Comentários

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

A seção Segmentação (guia de programação C#) aborda a segmentação.

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

Em geral, evitar o bloqueio em um public tipo ou instâncias além controle do seu código de. De construções comunslock (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 é acessível publicamente.

  • lock(“myLock”) é um problema como qualquer Outros código no processo usando a mesma seqüência, compartilham o mesmo bloquear.

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

Exemplo

O exemplo a seguir mostra um uso simples de threads sem bloqueio no translation from VPE for Csharp.

//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. Mesmo tempo que o lock demonstrativo está presente, o bloco de demonstrativo é 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 as seções a seguir no Especificação da linguagem C#:

  • 5.3.3.18 Bloquear instruções

  • 8.12 A demonstrativo bloquear

Consulte também

Tarefas

Exemplo de tecnologia de sincronização do Monitor

Aguarde sincronização Tecnologia Exemplo

Conceitos

Guia de Programação C#

Monitores

Operações interligadas

AutoResetEvent

Referência

Segmentação (guia de programação C#)

Palavras-chave C#

Palavras-chave de demonstrativo (referência translation from VPE for Csharp)

MethodImplAttributes

Mutex

Como: Declarar um evento em uma interface e implementá-lo em uma classe (Guia de programação C#)

Outros recursos

Referência C#