Java'da bir nesnenin monitörünün anlamı nedir? Neden bu kelimeyi kullanıyorsunuz?


87

Java konuları hakkında makaleler okurken sık sık şu ifadeyi fark ediyorum: "mevcut iş parçacığı, bu nesnenin monitörünün sahibidir". Anlamı anlıyorum: iş parçacığı nesne üzerinde işlem yapma hakkına sahip. Ama neden "nesnenin kilidi" yerine "nesnenin monitörü" ifadesini kullandığımıza şaşırdım.

Kısaca, 'monitör' kelimesinin anlamını bilmiyorum Soru tuhaf ve basit olabilir. Ama sorunun çözülmesine herhangi birinin yardım etmesini diliyorum. 3k


1
Sorunuzu yanıtlayan tek kişi olduğu için +1 @ulmangt: Onlara "monitörler" diyoruz çünkü Hoare onları 1974'te geri çağırdı.
Solomon Slow

Yanıtlar:


52

ama şaşkınım neden "nesnenin monitörü" kelimesini "nesnenin kilidi" yerine kullanıyorum?

Bu bağlamda kullanılan "monitör" terimini açıklayan bağlantılar için ulmangt'ın yanıtına bakın. Bunu not et:

"Monitörler Per Brinch Hansen ve CAR Hoare tarafından icat edildi ve ilk olarak Brinch Hansen'in Eşzamanlı Pascal dilinde uygulandı."

(Kaynak: Wikipedia )

Neden "kilit" yerine "monitör" terimini kullanıyorsunuz? Açıkçası, terimler farklı anlamlara gelir ... özellikle de onları başlangıçta kullanılması amaçlandıkları şekilde kullanırsanız.

  • Bir "kilit", belirli kilit özelliklerini koruyan alma ve bırakma ilkelerini içeren bir şeydir; örneğin özel kullanım veya tek yazar / çoklu okuyucu.

  • "İzleme", herhangi bir zamanda yalnızca bir iş parçacığının belirli bir kod bölümünü (veya bölümlerini) çalıştırabilmesini sağlayan bir mekanizmadır. Bu, bir kilit (ve iş parçacıklarının koşulun yerine getirildiğine dair diğer iş parçacıklarına bildirim göndermesini veya beklemesine izin veren "koşul değişkenleri") kullanılarak uygulanabilir, ancak bu sadece bir kilitten daha fazlasıdır. Aslında, Java durumunda, bir monitör tarafından kullanılan gerçek kilide doğrudan erişilemez. (Bir Java Lockörneğinde olduğu gibi, diğer iş parçacıklarının onu almasını önlemek için "Object.lock ()" diyemezsiniz .)

Kısacası, bilgiçlik taslayan biri varsa, "izlemek" aslında Java'nın sağladığını karakterize etmek için "kilitlemekten" daha iyi bir terimdir. Ancak pratikte her iki terim de neredeyse birbirinin yerine kullanılır.



10

Java Sanal Makinesi İçinden Alıntı

Java sanal makinesindeki bir iş parçacığı, bir izleme bölgesinin başına geldiğinde bir kilit ister. Java'da iki tür izleme bölgesi vardır: senkronize ifadeler ve senkronize yöntemler.

İzleme

Bir monitör, aynı anda yalnızca bir iş parçacığı tarafından işgal edilebilen özel bir oda içeren bir bina gibidir. Oda genellikle bazı veriler içerir. Bir iş parçacığı bu odaya girdiği andan ayrıldığı ana kadar odadaki tüm verilere özel erişime sahiptir. Monitör binasına girmeye "monitöre girmek" denir. Binanın içindeki özel odaya girmeye "monitör edinme" denir. Odayı işgal etmeye "monitöre sahip olma", odayı terk etmeye ise "monitörü serbest bırakma" denir. Tüm binayı terk etmeye "monitörden çıkmak" denir.

Bir monitör, bir bit veriyle ilişkilendirilmesine ek olarak, bu kitapta izleme bölgeleri olarak adlandırılacak olan bir veya daha fazla kod biti ile ilişkilendirilir.

Daha önce bahsedildiği gibi, dil, programlarınızdaki izleme bölgelerini tanımlamak için iki yerleşik yol sağlar: senkronize ifadeler ve senkronize yöntemler. Senkronizasyonun karşılıklı dışlama yönünü uygulayan bu iki mekanizma, Java sanal makinesinin komut seti tarafından desteklenmektedir.

Kilit

Monitörlerin karşılıklı dışlama özelliğini uygulamak için, Java sanal makinesi her nesne ve sınıfla bir kilidi (bazen muteks olarak adlandırılır) ilişkilendirir. Kilit, aynı anda yalnızca bir iş parçacığının "sahip olabileceği" bir ayrıcalık gibidir.

Tek bir iş parçacığının aynı nesneyi birden çok kez kilitlemesine izin verilir. Her nesne için Java sanal makinesi, nesnenin kaç kez kilitlendiğinin bir sayısını saklar. Kilidi açılmış bir nesnenin sayısı sıfırdır. Bir iplik kilidi ilk kez aldığında, sayı tekrar bire çıkarılır. İplik aynı nesne üzerinde bir kilit kazandığında, sayı yeniden artırılır.


6

Bir nesnenin synchronizedetrafındaki bir blok object, nesnenin üzerindeki bir kilidi kontrol eden monitördür. İşte bir örnek

synchronized (object) {
   while (<condition does not hold>)
      object.wait(timeout);
   ... // Perform action appropriate to condition
}

4

Bu soruyu cevaplamak için geç olsa da, eğer işe yarayacak diye eklemeyi düşündüm.
Burada, senkronize edilmemiş bir Java yöntemi içinde senkronize edilmiş bir Java kodu bloğu verilmiştir.

public void add(int value){
synchronized(this){
      this.count += value;
   }
}

Örnekte, add yönteminin çağrıldığı durum olan "this" kullanılmıştır. Senkronize edilmiş bir örnek yöntemi, ait olduğu nesneyi izleme nesnesi olarak kullanır.
=> Aynı monitör nesnesinde senkronize edilmiş bir Java kod bloğu içinde yalnızca bir iş parçacığı yürütülebilir.


3

Java Virtual Machine, çoklu okumayı desteklemek için monitörler kullanır. İzleyiciler bunu iki kavramla başarırlar - İplikleri çalıştırırken karşılıklı dışlama (burada 'kilitlemenin' devreye girdiği yer) ve iş parçacıkları arası iletişimin bir aracı olarak koordinasyon (burada nesnenin bekleme ve bildirim yöntemlerinin ortaya çıktığı yer burasıdır).

Aşağıdaki bölümü "Inside JVM" den okumak bu şüpheyi ortadan kaldıracaktır, burada çok güzel açıklanmış mı (Bölüm 20, İş Parçacığı senkronizasyonu) -

https://www.artima.com/insidejvm/ed2/threadsynchP.html

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.