Aracılığıyla paylaş


LOCK deyimi (C# Reference)

lock Anahtar sözcüğü belirli bir nesne için karşılıklı dışlama kilidi alma, bir deyimi yürütme ve kilidin açılması Bu deyim bloğundaki önemli bir bölümü işaretler. Aşağıdaki örnek içeren bir lock ifadesi.

    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;
            }
        }
    }

Daha fazla bilgi için bkz. İş parçacığı eşitleme (C# ve Visual Basic).

Notlar

lock Anahtar sözcüğünü sağlar başka bir iş parçacığı kritik bölümünde çalışırken bir iş parçacığının kodunun önemli bir bölümü geçmiyor. Kilitli bir kodu girmek başka bir iş parçacığı çalışırsa, bekler, nesneyi serbest bırakılıncaya kadar engelleyin.

Bölüm İş parçacığı (C# ve Visual Basic) iş parçacığı oluşturma anlatılmaktadır.

lock Anahtar sözcük aramaları Enter bloğun başlangıcında ve Exit blok sonunda. A ThreadInterruptedException , atılan Interrupt girmek için bekleyen bir iş parçacığı kesen bir lock ifadesi.

Genel olarak, üzerinde kilitlememek bir public türü veya örnekleri kodu 's denetimi dışındadır. Ortak yapıları lock (this), lock (typeof (MyType)), ve lock ("myLock") bu kılavuz ihlal:

  • lock (this)Örnek genel olarak erişilebilen bir sorun olur.

  • lock (typeof (MyType))sorun ise MyType genel olarak erişilebilir.

  • lock("myLock")herhangi bir başka bir kod aynı dizesini kullanarak işlem paylaştığından aynı kilit bir sorundur.

En iyi yöntem olduğunu tanımlamak için bir private , kilitlemek için nesne ya da bir private static tüm örneklerine ortak verileri korumak için nesne değişkeni.

Kullanamazsınız beklemek gövde metninde anahtar sözcüğü bir lock ifadesi.

Örnek

Aşağıdaki örnek, C# [NULL]'ta kilitlemeden basit bir iş parçacığı kullanımını göstermektedir.

    //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

Aşağıdaki örnek iş parçacıkları kullanır ve lock. Sürece lock deyimi, deyim bloğundaki önemli bir bölümü olan ve balance hiçbir zaman negatif bir sayı olur.

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

C# dil belirtiminin

Daha fazla bilgi için bkz: C# dil belirtiminin. Dil belirtimi, C# sözdizimi ve kullanımı için nihai kaynaktır.

Ayrıca bkz.

Başvuru

C# anahtar sözcükler

Deyimi anahtar sözcükler (C# Reference)

MethodImplAttributes

Mutex

İş parçacığı eşitleme (C# ve Visual Basic)

Kavramlar

C# Programlama Kılavuzu

Monitörler

İnterlocked işlemleri

AutoResetEvent

Diğer Kaynaklar

C# Başvurusu

İş parçacığı (C# ve Visual Basic)