Sdílet prostřednictvím


lock – příkaz (Referenční dokumentace jazyka C#)

lock Klíčové slovo označuje blok příkazu jako kritický oddíl získání zámku vzájemné vyloučení pro daný objekt, příkaz a potom uvolnění uzamčení.V následujícím příkladu lock prohlášení.

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

        public void Withdraw(decimal amount)
        {
            lock (thisLock)
            {
                if (amount > balance)
                {
                    throw new Exception("Insufficient funds");
                }
                balance -= amount;
            }
        }
    }

Další informace naleznete v tématu Synchronizace vláken (C# and Visual Basic).

Poznámky

lock Klíčové slovo zajišťuje jeden podproces je jiný podproces v důležité části nepřešel kritické části kódu.Pokud jiný podproces pokusí zadat kód zamknuté, počká, blokovat, dokud je objekt uvolněn.

V části Dělení na vlákna (C# and Visual Basic) popisuje podprocesů.

lock Volání klíčové slovo Enter na začátku bloku a Exit na konci bloku.A ThreadInterruptedException je vyvolána při Interrupt přerušení podprocesu, který čeká na zadání lock prohlášení.

Nepoužívejte na zamykání public typu nebo instance ovlivnit váš kód.Konstrukce běžné lock (this), lock (typeof (MyType)), a lock ("myLock") porušují tyto obecné zásady:

  • lock (this)problém je, pokud je instance veřejně přístupná.

  • lock (typeof (MyType))Pokud je problém MyType je veřejně přístupná.

  • lock("myLock")je problém, protože jiný kód procesu pomocí stejného řetězce budou sdílet stejnou zámku.

Nejlepší je definovat private objektu, který chcete zamknout, nebo private static objektové proměnné chránit data společná pro všechny instance.

Nelze použít očekávat klíčové slovo v textu lock prohlášení.

Příklad

Následující ukázka představuje jednoduché používání podprocesů bez blokování v jazyce 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

Následující příklad používá podprocesů a lock.Dokud lock prohlášení, prohlášení blok je kritická sekce a balance nikdy stane záporné číslo.

// 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 never is 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();
            }
        }
    }

Specifikace jazyka C#

Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také

Referenční dokumentace

Klíčová slova jazyka C#

Klíčová slova příkazů (Referenční dokumentace jazyka C#)

MethodImplAttributes

Mutex

Synchronizace vláken (C# and Visual Basic)

Koncepty

Průvodce programováním v C#

Sledování

Propojené operace

AutoResetEvent

Další zdroje

Referenční dokumentace jazyka C#

Dělení na vlákna (C# and Visual Basic)