Aracılığıyla paylaş


SyncLock Deyimi

Blok yürütmeden önce deyimi bloğu için kilit isteklerdir.

SyncLock lockobject
    [ block ]
End SyncLock

Bölümleri

  • lockobject
    Gerekli.Bir nesne başvurusu değerlendirilen deyimdir.

  • block
    İsteğe Bağlı.Kilit alındığında çalıştırılacak olan deyimleri bloğunu.

  • End SyncLock
    Sonlandıran bir SyncLock blok.

Notlar

SyncLock Deyimi sağlar birden çok iş parçacığı, aynı zamanda deyim bloğundaki yürütülmez.SyncLockHer iş parçacığı diğer bir iş parçacığının çalıştırdığından kadar blok girişini engeller.

En yaygın kullanımı, SyncLock birden fazla iş parçacığı tarafından eşzamanlı olarak güncelleştirilmesini verileri korumak için değil.Verileri işlemek ifade tamamlama kesinti olmadan gidin, bunları içine yerleştirmek bir SyncLock blok.

Kilit tarafından korunan bir ifade bloðu bazen adlı bir kritik bölüm.

Kurallar

  • Dallanma.İçine dallanma edilemez bir SyncLock bloğunun dışını engellenmesine karşı.

  • Kilit nesne değeri.Değeri lockobject olamaz Nothing.Bunu kullanmadan önce kilit nesnesi oluşturmanız gerekir bir SyncLock ifadesi.

    Değerini değiştiremezsiniz lockobject yürütülürken bir SyncLock blok.Kilit nesnesi değişmediği mekanizması gerektirir.

  • Kullanamazsınız Await işleci bir SyncLock blok.

Davranış

  • Mekanizması.Bir iş parçacığı ulaştığında SyncLock ifadesi olarak değerlendirilir lockobject ifade ve yürütme deyim tarafından döndürülen nesne üzerinde özel kilit ele geçirme işlemi sayısı kadar askıya alır.Başka bir iş parçacığı ulaştığında SyncLock deyimi, onu değil Sunucusu'ndan bir kilit ilk iş parçacığı gerçekleştirinceye End SyncLock ifadesi.

  • Korumalı veriler.lockobject Olan bir Shared değişken, özel kilit bir iş parçacığında herhangi bir sınıfın örneğini yürütülmesini engeller SyncLock başka bir iş parçacığının çalıştırdığından engellemek.Bu, tüm örnekleri arasında paylaşılan verileri korur.

    lockobject Örnek değişkeni (değil Shared), geçerli örnek yürütülmesini çalışan iş parçacığı kilit engeller SyncLock bloğu başka bir iş parçacığı aynı örneğinde aynı anda.Bu, tek tek örneği tarafından tutulan verileri korur.

  • Alım ve yayın.A SyncLock blok gibi davranan bir Try...Finally yapım, Try bloğu üzerinde özel kilit edinme lockobject ve Finally blok yayımlar.Bu yüzden SyncLock blok blok çıkmak ne olursa olsun lock, yayın güvence altına alır.Bu, hatta işlenmeyen bir özel durum söz konusu olduğunda geçerlidir.

  • Framework çağrılar.SyncLock Blok isteklerdir ve çağırarak özel kilit serbest Enter ve Exit yöntemleri Monitor , sınıf System.Threading ad alanı.

Programlama yöntemleri

lockobject İfade her zaman değerlendirmek için özellikle sınıfına ait bir nesne.Bildirmeniz gerekir bir Private nesne değişkeni geçerli örneğine ait verileri korumak veya bir Private Shared tüm örneklerine ortak verileri korumak için nesne değişkeni.

Değil kullanması gereken Me kilit sağlamak için anahtar sözcüğünü nesne örneği için veri.Sınıfınız için harici kod kendi sınıfının bir örneği için bir başvuru varsa, onu bu başvuru için kilit nesne olarak kullanabilir bir SyncLock blok sizinkinden, tamamen farklı farklı verileri koruma.Bu yolla sizin ve diğer sınıflarını birbirlerine kendi ilgisiz yürütülmesini engelleyin SyncLock engeller.Herhangi bir başka bir kod aynı dizesini kullanarak işlemi aynı kilit paylaşacak bu yana benzer biçimde bir dize üzerinde kilitleme sorunlu olabilir.

Ayrıca değil kullanmanız gerekir Me.GetType sağlamak için bir kilit nesnesi yöntemi paylaşılan veriler.Bu, çünkü GetType her zaman aynı fonksiyonu Type nesne için belirtilen sınıf adı.Harici kod çağrısı GetType kendi sınıfında ve kullanmakta olduğunuz aynı kilit nesnesini alın.Bu birbirinden engelleme iki sınıf neden kendi SyncLock engeller.

Örnekler

Description

Aşağıdaki örnek, basit bir ileti listesini tutan bir sınıf gösterir.İletileri bir dizi içinde sakladığı ve son o dizinin öğesi bir değişkende kullanılır.addAnotherMessage Yordam son öğe artırır ve yeni ileti saklar.Bu iki işlem tarafından korunan SyncLock ve End SyncLock ifadeleri, çünkü son öğenin artýrýlýr sonra başka bir iş parçacığı son öğenin yeniden artırabilirsiniz önce yeni bir ileti depolanması gerekir.

simpleMessageList Sınıfının tüm örneklerini, değişkenler arasındaki iletilerin bir listesini paylaşılan messagesList ve messagesLast olarak bildirilen Shared.Bu durumda, değişken messagesLock da Shared, orada olacak şekilde her örneği tarafından kullanılan bir tek kilit nesnesi.

Kod

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

Description

Aşağıdaki örnek, iş parçacıkları kullanır ve SyncLock.Sürece SyncLock deyimi, deyim bloğundaki önemli bir bölümü olan ve balance hiçbir zaman negatif bir sayı olur.Dışarı yorum SyncLock ve End SyncLock bırakarak etkisini görmek için ifadeleri SyncLock anahtar sözcüğü.

Kod

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

Ayrıca bkz.

Başvuru

System.Threading

Monitor

İş Parçacığı Eşitleme (C# ve Visual Basic)

Diğer Kaynaklar

İş Parçacığı Oluşturma (C# ve Visual Basic)