Özel bir kilit ile paylaşılan bir kilit arasındaki fark nedir?


119

Wikipedia'ya göre,

Paylaşılan kilitler bazen "okuma kilitleri" olarak adlandırılır ve özel kilitler bazen "yazma kilitleri" olarak adlandırılır.

"Paylaşılan" ve "özel" terimlerinin arkasındaki mantığı açıklayabilir misiniz?


Özel olmayan kilit, paylaşılan kilidin başka bir adı mı?
Ramesh Papaganti

Yanıtlar:


419

Bu cevabı yazdım çünkü bunun eğlenceli (ve uygun) bir benzetme olacağını düşündüm:

Bir öğretmen (yazar) ve birçok öğrencinin (okuyucunun) bulunduğu bir sınıfta kilitlenebilir bir nesneyi kara tahta (kilitlenebilir) olarak düşünün .

Bir öğretmen tahtaya bir şey (özel kilit) yazarken:

  1. Kimse okuyamaz çünkü hala yazılıyor ve o sizin görüşünüzü engelliyor => Bir nesne özel olarak kilitliyse, paylaşılan kilitler elde edilemez .

  2. Diğer öğretmenler de gelip yazmaya başlamazlar ya da pano okunamaz hale gelir ve öğrencilerin kafasını karıştırır => Bir nesne özel olarak kilitliyse, diğer özel kilitler elde edilemez .

Öğrenciler okurken (paylaşılan kilitler) tahtada ne var:

  1. Hepsi birlikte üzerinde ne olduğunu okuyabilir => Birden fazla paylaşılan kilit birlikte var olabilir .

  2. Öğretmen tahtayı daha fazla yazmak için temizlemeden önce okumayı bitirmelerini bekler => Bir veya daha fazla paylaşılan kilit zaten mevcutsa, özel kilitler elde edilemez .


2
çok iyi bir açıklama. Ancak PO , kendi başına termlerin açıklamasını değil, "paylaşılan" ve "özel" mezheplerin kökenini sordu .
serhio

Bu "Bir veya daha fazla paylaşılan kilit zaten varsa, özel kilitler elde edilemez." doğru? ReentrantReadWriteLock? Yazma kilidinin herhangi bir zamanda elde edilebileceğini düşündüm, aksi takdirde sürekli okuma nedeniyle yazma için açlık olabilir.
Kanagavelu Sugumar

1
@KanagaveluSugumar, evet, doğru. Başka bir varlık aynı nesne üzerinde zaten bir okuma kilidine sahipse bir yazma kilidi elde edemezsiniz. Okuma-yazma kilidinin tüm amacı budur. Başkası okurken bir şeyin üzerine yazarsanız, o zaman onlar ne okur? Neden özellikle "yeniden giren" bir okuma-yazma kilidi seçtiğinizi bilmiyorum, ancak yeniden giriş, bir yeniden giriş kilidinin sahibinin onu tekrar 'kilitleyebileceği ()' ve sonraki tüm lock()aramaları ilki hemen ve başarılı bir şekilde geri dönecektir. yani zaten sahip olduğunuz bir şeyi başarıyla kilitleyebilirsiniz.
ArjunShankar

2
Ayrıca, "Yazma kilidinin herhangi bir zamanda elde edilebileceğini düşündüm, aksi takdirde sürekli okuma nedeniyle yazma için açlık olabilir" - bu kesinlikle olamaz. Başka bir varlık zaten bir okuma / yazma kilidine sahipken bir yazma kilidi elde edilemez . Ne olabilir gerçekleşmesi birden kişiler zaten bir nesneyi kilitlemek için bekleyen varsa, o zaman bir bekleme olmasıdır writerbekleyen okuyucular arasında öncelik verilir edildiğinde kilidi alır kilit seçer sonraki (onun şimdiki sahibi tarafından kilitli değilken). Bu politika ile ilgili .
ArjunShankar

Teşekkür ederim! ReentrantReadWriteLock'u seçtim; çünkü bu, java'da ReadWriteLock için uygulama sınıfıdır. Sonra, yazma iş parçacığı beklemeye başladığında beklemek üzere daha fazla yeni okuma iş parçacığı söylemek için yükseltilmiş herhangi bir bayrak veya daha fazla öncelik var mı? Çünkü sürekli okuma isteği nedeniyle yazma iş parçacığı açlığını nasıl önleyebiliriz?
Kanagavelu Sugumar

34

Oldukça basit. Okuma kilitleri, aynı anda birden fazla işlem okuyabildiğinden, paylaşılan kilitler olarak da bilinir. Bir okuma kilidinin amacı, başka bir işlem tarafından bir yazma kilidinin edinilmesini önlemektir. Buna karşılık, bir yazma kilidi, bir yazma işlemi tamamlanırken diğer tüm işlemleri engeller, bu nedenle özel olarak tanımlanır.

Bu nedenle, bir okuma kilidi "şimdi okuyabilirsiniz, ancak yazmak istiyorsanız beklemeniz gerekir" derken, yazma kilidi "beklemeniz gerekecek" der.


Çalışmalarını desteklemek için araştırma yaptığının farkındayım ama ders verme dürtüsüne karşı koyamıyorum.

Kilitlemenin yetersiz kullanımı, performans baş ağrılarının başlıca nedenidir. Okuma ve yazma kilitlerini ayırt eden bir kilitleme sisteminin kullanılması iyi bir başlangıçtır, ancak dikkatli tasarım bazen kilitleme ihtiyacının çoğunu ortadan kaldırabilir. Örneğin, oturum durumu hiçbir zaman durum öğesi başına tek bir küresel koleksiyonda tutulmamalıdır.

Aslında bunun yapıldığını gördüm. Bu iğrenç bir tasarım, boks yapmaya ve oturum durumundaki her son değişiklik için koleksiyonda bir değişikliğe neden olarak uzun süreli bir yazma kilidi gerektiriyor. Genel giderler, sunucuyu etkili bir şekilde tek iş parçacıklı davranışa indirgeyerek sakat bırakıyordu.

Basitçe tüm oturum durumunu bir yapıda toplamak büyük bir gelişme oldu. Oturum durumundaki değişiklikler yalnızca bir oturumun durum yapısının üyelerinin değerlerini değiştirdi. Başka hiçbir oturum bir oturumun durumuna doğrudan başvurma fırsatı ve hatta fırsatı olmadığından, güncellenen tek koleksiyon oturumların listesiydi. Sonuç olarak, bir oturum sırasında kilitleme tamamen gereksizdi , yalnızca başlangıçta ve sonunda ve işlem hacmi 3000 kat arttı.

Diğer yaygın kilitleme senaryosu, bir kullanıcı uygulamasının iş parçacıkları arasında paylaşılan kaynaklardır. Çoğu modern çerçeve bunu kilitler yerine mesajları kullanarak ele alır; "UI iş parçacığına geçiş yaptığınızda" aslında bir işlev işaretçisi ve bazı parametreler (veya uygulamaya bağlı olarak bir temsilci ve bir yığın çerçevesi) içeren bir mesajı kuyruğa almış olursunuz.


6
  • Özel veya yazma kilidi, dosyanın belirtilen bölümüne yazmak için işleme özel erişim sağlar. Bir yazma kilidi uygulandığında, başka hiçbir işlem dosyanın bu bölümünü kilitleyemez.

  • Paylaşılan veya okuma kilidi, başka herhangi bir işlemin dosyanın belirtilen bölümünde bir yazma kilidi istemesini yasaklar. Ancak, diğer işlemler okuma kilitleri isteyebilir.

Daha fazlası için: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html


2

Prensip veritabanı tarafında da aynı. Oracle belgelerine göre

Özel kilit modu, ilişkili kaynağın paylaşılmasını engeller. Bu kilit modu, verileri değiştirmek için elde edilir. Bir kaynağı özel olarak kilitlemek için ilk işlem, özel kilit serbest bırakılıncaya kadar kaynağı değiştirebilen tek işlemdir.

Paylaşım kilidi modu, ilgili işlemlere bağlı olarak ilgili kaynağın paylaşılmasına izin verir. Verileri okuyan birden çok kullanıcı, bir yazarın (özel bir kilide ihtiyacı olan) eşzamanlı erişimini önlemek için paylaşım kilitlerini tutarak verileri paylaşabilir. Birkaç işlem
, aynı kaynakta paylaşım kilitleri alabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.