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
İş Parçacığı Eşitleme (C# ve Visual Basic)