Java'da monitör nedir?


130

Java'da eşzamanlı programlamada hangi monitörden bahsedilir?

"Her nesnenin bir monitörle ilişkilendirildiğini" okuduğumda bu ne anlama geliyor?

Özel bir nesne mi?


11
+1 Bu, monitörlerin JVM düzeyinde nasıl uygulandığını okumamı sağladı. Yeni bir şey öğrendim
naikus

@naikus Sizden ayrıntıları paylaşmanızı bekliyorum :)
roottraveller

Yanıtlar:


90

Monitör, bir nesneye eşzamanlı erişimi kontrol eden mekanizmadır.

Bu, şunları yapmanızı sağlar:

Konu 1:

public void a()
{
    synchronized(someObject) {
        // do something (1)
    }
}

Konu 2:

public void b()
{
    synchronized(someObject) {
        // do something else (2)
    }
}

Bu, İplik 1 ve 2'nin aynı anda izlenen (senkronize edilmiş) bölüme erişmesini engeller. Biri başlayacak ve monitör, ilki bitmeden diğerinin bölgeye erişimini engelleyecektir.

Özel bir nesne değil. It senkronizasyon mekanizması sınıf hiyerarşisi kökünde yer: java.lang.Object.

Orada da waitve notifyaynı zamanda farklı iş parçacıkları arasında iletişim için nesnenin monitörü kullanacak yöntemleri.


1
Öyleyse senkronize bir yöntem oluşturduğumuzda, o nesnenin yönteminde bir kilit (monitör) tanımladığımızı söyleyebilir miyiz?
xdevel2000

28
Tam olarak değil. Her nesne, başka herhangi bir şeyden bağımsız olarak otomatik olarak kendisiyle ilişkilendirilmiş bir monitöre (muteks) sahiptir. Senkronize edilmiş bir yöntemi bildirdiğinizde, çalışma zamanının, bu yöntemin yürütülmesi başlamadan önce nesnenin monitöründeki kilidi alması gerektiğini (ve denetim çağıran koda dönmeden önce kilidi serbest bırakması gerektiğini) bildirmiş olursunuz.
Andrzej Doyle

31
Ve @Pablo - yöntem için monitör diye bir şey yoktur; monitörler yalnızca, çoğu yöntem için çevreleyen örnek veya Classstatik yöntemler için karşılık gelen nesne olan nesneler için mevcuttur. Zaten senkronize edilmiş bir method1 () yönteminiz varsa ve method2 () 'nin senkronize olduğunu bildirirseniz, yeni monitörler oluşturulmaz ve aslında her iki yöntemi de (aynı nesne üzerinde) çağırmak aynı monitörü kilitlemeye çalışacaktır. Bu genellikle yeni gelenleri yakalar.
Andrzej Doyle

1
@Andrzej: yani, her nesnenin kendisiyle ilişkilendirilmiş BİR monitörü vardır. O zaman birçok senkronize yöntemim olabilir. Bu yöntemlerden her ne zaman sonra bir iş parçacığı çağırırsa, senkronizasyon işlerini yapan monitör elde edilir.
xdevel2000

1
sadece bunu açıklığa kavuşturmak gerekiyor ... evre 1'de senkronize bir blok çağırmak için kullanılan nesne aynı zamanda normal yöntemi (senkronize değil) çağırmak için başka bir evrede (evre 2) tekrar kullanılabilir mi?

27

Bir monitör bir hem sahip bir varlıktır kilit ve bir bekleme seti . Java'da herhangi Objectbiri bir monitör görevi görebilir.

Java'da monitörlerin nasıl çalıştığına dair ayrıntılı bir açıklama için, Java'da Eşzamanlı Programlama'nın İzleme Mekaniği bölümünü okumanızı tavsiye ederim (önceki bağlantı Google kitaplarındaki önizlemeyi gösterir ve bu bölüm okunabilir).


"Bir monitör bir varlıktır .." dediğiniz gibi, monitörün kilide sahip olan / izleyen ve bekleyen bir iç nesne / durum olduğu anlamına mı gelir? Değilse, Varlığı burada detaylandırır mısınız? Temel olarak java doc Wakes up all threads that are waiting on this object's monitor. notifyall () hakkında söylediğimizde, aldığım şey nesnenin korunmasıdır (dahili varlık / nesnenin yardımıyla) tüm iş parçacıkları kilitlenmeyi bekliyor, bu iç varlık / nesne monitör olarak adlandırılıyor?
user3198603

En kullanışlı cevap. Teşekkürler @ JRL.
gravetii

Benim için şöyle diyor: "Bu sayfa için önizleme yok."
opncow

9
  1. Bir monitör, Java Dili ile sınırlı olmayan bir kavram / mekanizmadır;
  2. "Eşzamanlı programlamada, monitör, birden fazla iş parçacığı tarafından güvenli bir şekilde kullanılması amaçlanan bir nesne veya modüldür";
  3. Her okuyucunun bildiği gibi, Java'daki her nesne java.lang.Object öğesinin bir alt sınıfıdır. Java çalışanları java.lang.Object'i, Java programcılarının herhangi bir nesneyi monitör olarak kullanmasını sağlayan özellik ve özelliklere sahip olacak şekilde yaptılar. Örneğin, her nesnenin bir bekleme kuyruğu, bir yeniden giriş kuyruğu ve onu bir monitör yapan yöntemleri bekleme ve bildirme vardır;
  4. burada monitörler hakkında bilgi edinin .

4

Java dili ve çalışma zamanı sistemi, monitörlerin kullanımı yoluyla iş parçacığı senkronizasyonunu destekler.
Bir monitör, belirli bir veri öğesi (bir durum değişkeni) ile ilişkilendirilir ve bu veriler üzerinde bir kilit işlevi görür. Bir iş parçacığı bazı veri öğeleri için monitörü tuttuğunda, diğer iş parçacıkları kilitlenir ve verileri inceleyemez veya değiştiremez.



2

Monitor, iş parçacıklarının hem karşılıklı dışlama hem de belirli bir koşulun gerçekleşmesi için bekleme (engelleme) yeteneğine sahip olmasını sağlayan bir senkronizasyon yapısıdır.

Monitörler ayrıca diğer iş parçacıklarına durumlarının karşılandığını bildirmek için bir mekanizmaya sahiptir. Hem kilit hem de bekleme setine sahip bir varlıktır. Java'da herhangi bir Nesne bir monitör görevi görebilir.

Java sanal makinesinde, her nesne ve sınıf mantıksal olarak bir monitörle ilişkilendirilir. Monitörlerin karşılıklı dışlama yeteneğini uygulamak için, her nesne ve sınıfla bir kilit (bazen muteks olarak adlandırılır) ilişkilendirilir. Buna işletim sistemi açısından semafor denir, muteks ise ikili bir semafordur.

Daha fazla bilgi için bağlantıyı kontrol edin


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.