SyncLock DeyimiSyncLock Statement

Bloğu yürütmeden önce bir ifade bloğu için özel bir kilit elde edin.Acquires an exclusive lock for a statement block before executing the block.

SyntaxSyntax

SyncLock lockobject  
    [ block ]  
End SyncLock  

BölümlerParts

lockobject
Gereklidir.Required. Bir nesne başvurusunu değerlendiren ifade.Expression that evaluates to an object reference.

block
İsteğe bağlı.Optional. Kilit elde edildiğinde yürütülecek deyimler bloğu.Block of statements that are to execute when the lock is acquired.

End SyncLock
Bir SyncLock bloğu sonlandırır.Terminates a SyncLock block.

AçıklamalarRemarks

SyncLockİfade, birden çok iş parçacığının aynı anda ekstre bloğunu yürütmemesini sağlar.The SyncLock statement ensures that multiple threads do not execute the statement block at the same time. SyncLock başka bir iş parçacığı yürütülene kadar her bir iş parçacığının blok girmesini engeller.SyncLock prevents each thread from entering the block until no other thread is executing it.

En yaygın kullanımı, SyncLock verilerin birden fazla iş parçacığı tarafından aynı anda güncelleştirilmesini sağlar.The most common use of SyncLock is to protect data from being updated by more than one thread simultaneously. Verileri işleyen deyimlerin kesinti olmadan tamamlanmasına gitmesi gerekiyorsa, bunları bir blok içine koyun SyncLock .If the statements that manipulate the data must go to completion without interruption, put them inside a SyncLock block.

Özel bir kilit tarafından korunan bir ifade bloğu bazen kritik bir bölüm olarak adlandırılır.A statement block protected by an exclusive lock is sometimes called a critical section.

KurallarRules

  • Dallanma.Branching. Bloğunun dışından bir bloğa dallandırılamıyor SyncLock .You cannot branch into a SyncLock block from outside the block.

  • Nesne değerini kilitle.Lock Object Value. Değeri olamaz lockobject Nothing .The value of lockobject cannot be Nothing. Bir ifadede kullanmadan önce Lock nesnesini oluşturmanız gerekir SyncLock .You must create the lock object before you use it in a SyncLock statement.

    lockobjectBir blok yürütülürken değerini değiştiremezsiniz SyncLock .You cannot change the value of lockobject while executing a SyncLock block. Mekanizma, kilit nesnesinin değişmeden kalmasını gerektirir.The mechanism requires that the lock object remain unchanged.

  • Bir blokta await işlecini kullanamazsınız SyncLock .You can't use the Await operator in a SyncLock block.

DavranışBehavior

  • Mekanizmadır.Mechanism. Bir iş parçacığı ifadeye ulaştığında SyncLock , ifadeyi değerlendirir lockobject ve ifadenin döndürdüğü nesne üzerinde dışlamalı bir kilit elde edene kadar yürütmeyi askıya alır.When a thread reaches the SyncLock statement, it evaluates the lockobject expression and suspends execution until it acquires an exclusive lock on the object returned by the expression. Başka bir iş parçacığı SyncLock ifadeye ulaştığında, ilk iş parçacığı ifadeyi çalıştırana kadar bir kilit almaz End SyncLock .When another thread reaches the SyncLock statement, it does not acquire a lock until the first thread executes the End SyncLock statement.

  • Korumalı veriler.Protected Data. lockobjectBir Shared değişkense, dışlamalı kilit, SyncLock başka bir iş parçacığı yürütülürken, sınıfın herhangi bir örneğindeki bir iş parçacığının bloğunu yürütmesini engeller.If lockobject is a Shared variable, the exclusive lock prevents a thread in any instance of the class from executing the SyncLock block while any other thread is executing it. Bu, tüm örnekler arasında paylaşılan verileri korur.This protects data that is shared among all the instances.

    lockobjectBir örnek değişkenidir (değil Shared ), kilit, geçerli örnekte çalışan bir iş parçacığının SyncLock aynı anda aynı örnekteki başka bir iş parçacığı ile aynı zamanda yürütülmesini önler.If lockobject is an instance variable (not Shared), the lock prevents a thread running in the current instance from executing the SyncLock block at the same time as another thread in the same instance. Bu, bireysel örnek tarafından tutulan verileri korur.This protects data maintained by the individual instance.

  • Alma ve yayınlama.Acquisition and Release. Bir SyncLock blok Try...Finally , blok üzerinde özel bir kilit elde eden bir oluşturma gibi davranır Try lockobject ve Finally blok onu yayınlar.A SyncLock block behaves like a Try...Finally construction in which the Try block acquires an exclusive lock on lockobject and the Finally block releases it. Bu nedenle, bloğundan SyncLock çıktığınızda, blok kilidi garanti eder.Because of this, the SyncLock block guarantees release of the lock, no matter how you exit the block. Bu, işlenmemiş bir özel durum durumunda bile geçerlidir.This is true even in the case of an unhandled exception.

  • Çerçeve çağrıları.Framework Calls. SyncLockBloğu, Enter Exit Monitor ad alanındaki sınıfının ve yöntemlerini çağırarak dışlamalı kilidi alır ve serbest bırakır System.Threading .The SyncLock block acquires and releases the exclusive lock by calling the Enter and Exit methods of the Monitor class in the System.Threading namespace.

Programlama uygulamalarıProgramming Practices

lockobjectİfade her zaman yalnızca kendi sınıfınıza ait olan bir nesne olarak değerlendirilir.The lockobject expression should always evaluate to an object that belongs exclusively to your class. PrivateGeçerli örneğe ait verileri korumak için bir nesne değişkeni veya Private Shared tüm örneklerde ortak olan verileri korumak için bir nesne değişkeni bildirmeniz gerekir.You should declare a Private object variable to protect data belonging to the current instance, or a Private Shared object variable to protect data common to all instances.

MeÖrnek verileri için bir kilit nesnesi sağlamak üzere anahtar sözcüğünü kullanmamalısınız.You should not use the Me keyword to provide a lock object for instance data. Sınıfınıza dış kod, sınıfınızın bir örneğine başvuru içeriyorsa, bu başvuruyu SyncLock kendi sizinkinden tamamen farklı, farklı verileri koruyan bir blok için bir kilit nesnesi olarak kullanabilir.If code external to your class has a reference to an instance of your class, it could use that reference as a lock object for a SyncLock block completely different from yours, protecting different data. Bu şekilde, sınıfınız ve diğer sınıf, birbirini ilgisiz blokları yürütmelerini engelleyebilir SyncLock .In this way, your class and the other class could block each other from executing their unrelated SyncLock blocks. Aynı dizeyi kullanan işlemdeki diğer kodlar aynı kilidi paylaştığından, bir dizedeki aynı şekilde kilitleme sorunlu olabilir.Similarly locking on a string can be problematic since any other code in the process using the same string will share the same lock.

Ayrıca, Me.GetType paylaşılan veriler için bir kilit nesnesi sağlamak üzere metodunu kullanmamalısınız.You should also not use the Me.GetType method to provide a lock object for shared data. Bunun nedeni, GetType her zaman Type belirli bir sınıf adı için aynı nesneyi döndürmektedir.This is because GetType always returns the same Type object for a given class name. Dış kod GetType , sınıfınıza çağrı verebilir ve kullanmakta olduğunuz kilit nesnesini alabilir.External code could call GetType on your class and obtain the same lock object you are using. Bu, iki sınıfın bloklarından birbirini engellemesine neden olur SyncLock .This would result in the two classes blocking each other from their SyncLock blocks.

ÖrneklerExamples

AçıklamaDescription

Aşağıdaki örnek, bir ileti listesini tutan bir sınıfı gösterir.The following example shows a class that maintains a simple list of messages. Bir dizideki iletileri ve bu dizinin son kullanılan öğesini bir değişkende tutar.It holds the messages in an array and the last used element of that array in a variable. addAnotherMessageYordam, son öğeyi artırır ve yeni iletiyi depolar.The addAnotherMessage procedure increments the last element and stores the new message. Bu iki işlem ve deyimleri tarafından korunur SyncLock End SyncLock , çünkü son öğe artdıktan sonra yeni ileti, diğer herhangi bir iş parçacığının son öğeyi yeniden artırılabilmesi için önce depolanmalıdır.Those two operations are protected by the SyncLock and End SyncLock statements, because once the last element has been incremented, the new message must be stored before any other thread can increment the last element again.

Sınıf, simpleMessageList tüm örnekleri arasında bir ileti listesi paylaşmışsa, değişkenleri messagesList ve messagesLast olarak olarak bildirilenler Shared .If the simpleMessageList class shared one list of messages among all its instances, the variables messagesList and messagesLast would be declared as Shared. Bu durumda, değişken messagesLock de olmalıdır Shared , böylece her örnek tarafından kullanılan tek bir kilit nesnesi olur.In this case, the variable messagesLock should also be Shared, so that there would be a single lock object used by every instance.

KodCode

Class simpleMessageList
    Public messagesList() As String = New String(50) {}
    Public messagesLast As Integer = -1
    Private messagesLock As New Object
    Public Sub addAnotherMessage(ByVal newMessage As String)
        SyncLock messagesLock
            messagesLast += 1
            If messagesLast < messagesList.Length Then
                messagesList(messagesLast) = newMessage
            End If
        End SyncLock
    End Sub
End Class

DescriptionDescription

Aşağıdaki örnek, ve iş parçacıklarını kullanır SyncLock .The following example uses threads and SyncLock. Deyimin bulunduğu sürece SyncLock , ifade bloğu kritik bir bölümdür ve balance hiçbir zaman negatif bir sayı değildir.As long as the SyncLock statement is present, the statement block is a critical section and balance never becomes a negative number. SyncLock End SyncLock Anahtar sözcüğünü bırakma etkisini görmek için ve deyimlerini açıklama ekleyebilirsiniz SyncLock .You can comment out the SyncLock and End SyncLock statements to see the effect of leaving out the SyncLock keyword.

KodCode

Imports System.Threading

Module Module1

    Class Account
        Dim thisLock As New Object
        Dim balance As Integer

        Dim r As New Random()

        Public Sub New(ByVal initial As Integer)
            balance = initial
        End Sub

        Public Function Withdraw(ByVal amount As Integer) As Integer
            ' This condition will never be true unless the SyncLock statement
            ' is commented out:
            If balance < 0 Then
                Throw New Exception("Negative Balance")
            End If

            ' Comment out the SyncLock and End SyncLock lines to see
            ' the effect of leaving out the SyncLock keyword.
            SyncLock thisLock
                If balance >= amount Then
                    Console.WriteLine("Balance before Withdrawal :  " & balance)
                    Console.WriteLine("Amount to Withdraw        : -" & amount)
                    balance = balance - amount
                    Console.WriteLine("Balance after Withdrawal  :  " & balance)
                    Return amount
                Else
                    ' Transaction rejected.
                    Return 0
                End If
            End SyncLock
        End Function

        Public Sub DoTransactions()
            For i As Integer = 0 To 99
                Withdraw(r.Next(1, 100))
            Next
        End Sub
    End Class

    Sub Main()
        Dim threads(10) As Thread
        Dim acc As New Account(1000)

        For i As Integer = 0 To 9
            Dim t As New Thread(New ThreadStart(AddressOf acc.DoTransactions))
            threads(i) = t
        Next

        For i As Integer = 0 To 9
            threads(i).Start()
        Next
    End Sub

End Module

YorumlarComments

Ayrıca bkz.See also