Çok iş parçacıklı programlamanın gelişimiyle, birden fazla iş parçacığının aynı verilere eşzamanlı erişim problemi ortaya çıktı. Bu, öngörülemeyen hatalara ve programın durumunun bozulmasına yol açıyordu.
Visual Basic .NET'te, sadece bir iş parçacığının belirli bir kodu aynı anda çalıştırmasını sağlamak için SyncLock yapısı ile özel kilit mekanizması uygulanmaktadır.
Çözüm, paylaşılan kaynaklara erişim kodunun etrafında SyncLock (veya Monitor.Enter/Exit) kullanarak, kritik bölümün çalışması süresince nesneyi kilitlemektir.
Kod örneği:
Private Shared Counter As Integer = 0 Private Shared ReadOnly CounterLock As New Object() Public Shared Sub IncrementCounter() SyncLock CounterLock Counter += 1 End SyncLock End Sub
Anahtar özellikler:
Kilitleme belirteci olarak Integer, String veya Nothing türündeki bir değeri kullanmak mümkün mü?
Hayır, SyncLock bir referans nesnesi gerektirir. String'ler önerilmez, çünkü içki (interning) olasılığı nedeniyle dolaylı olarak kilit çakışmalarına neden olabilir.
Farklı iş parçacıkları aynı değişkeni kilitlemek için farklı nesneleri kullanırsa ne olur?
Hiçbir senkronizasyon olmayacak ve yarış koşulları ortaya çıkacak - tam olarak aynı nesne kilitlenmelidir.
SyncLock bloğundan çıktıktan sonra kilidi manuel olarak serbest bırakmak gerekir mi?
Hayır, bloktan çıkarken kilit otomatik olarak serbest bırakılır, hatta istisnalar durumunda bile.
Kodda SyncLock için stringler kullanılıyor, programın birkaç bölümü aynı string sabitlerini kullanıyor. Sonuç olarak farklı kilitler çakışıyor ve beklenmedik karşılıklı kilitlenmeler (deadlocks) ortaya çıkıyor.
Artılar:
Eksiler:
Her kritik bölüm için ayrı bir ReadOnly nesnesi tanımlanır. Sadece en küçük, gerçekten gerekli kod bölümü kilitlenir.
Artılar:
Eksiler: