1. Neden kilitli ve ne kilitli?
İş parçacıkları kullandığımızda, en verimli yol elbette asenkron, yani her iş parçacığı aynı anda, birbirine bağımlı olmadan ve beklemeden çalışıyor. Ancak, farklı iş parçacıklarının belirli bir kaynağa erişmesi gerektiğinde bir senkronizasyon mekanizması gereklidir; yani aynı kaynağı okuyup yazarken, her işlemin etkili ve anında olmasını sağlamak için kaynağı aynı anda yalnızca bir iş parçacığı tarafından çalıştırmamız gerekir, yani operasyonunun atomik olmasını sağlamak için. lock, C#'da lock(objectA){codeB} formatında en yaygın kullanılan senkronizasyon yöntemidir.
lock(objectA){codeB} basit görünse de, aslında üç anlamı vardır ve bu da onu uygun şekilde kullanmak için gereklidir: 1. ObjectA kilitli mi? Olmazsa kilitlerim, aksi takdirde objectA serbest bırakılana kadar beklerim. 2. Kilitlendikten sonra, diğer iş parçacıkları codeB'yi çağıramaz veya codeB çalıştırılırken objectA kullanamaz. 3. CodeB çalıştırıldıktan sonra, release objectA'ya ve codeB'ye diğer iş parçacıkları tarafından erişilebilir.
2. Kilit (bu) ne oldu?
Bir örnek bakalım:
t1 iş parçacığında, LockMe ana fonksiyonda lock(this), yani c1'i çağırır ve ana iş parçacığında lock(c1) çağırıldığında, c1'e erişmeden önce t1'deki lock bloğunun çalıştırılmasını beklemelidir; yani tüm c1 ile ilgili işlemler tamamlanamaz, yani c1 ile ilgili işlemler tamamlanamaz. DoNotLockMe() yürütülmez.
|