Che cos'è un monitor in Java?


130

A cosa si riferisce un monitor nella programmazione concorrente in Java?

Quando leggo che "ogni oggetto ha associato un monitor" che cosa significa?

È un oggetto speciale?


11
+1 Questo mi ha fatto leggere come sono implementati i monitor a livello di JVM.
Ho

@naikus Mi aspetto di condividere i dettagli da te :)
roottraveller,

Risposte:


90

Un monitor è un meccanismo per controllare l'accesso simultaneo a un oggetto.

Questo ti permette di fare:

Discussione 1:

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

Discussione 2:

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

Ciò impedisce ai thread 1 e 2 di accedere contemporaneamente alla sezione monitorata (sincronizzata). Uno verrà avviato e il monitor impedirà all'altro di accedere alla regione prima che il primo termini.

Non è un oggetto speciale. È meccanismo di sincronizzazione posta alla radice gerarchia di classi: java.lang.Object.

Ci sono anche waite notifymetodi che anche utilizzare il monitor dell'oggetto di comunicazione tra diversi thread.


1
quindi possiamo dire che quando creiamo un metodo sincronizzato stiamo definendo un blocco (monitor) sul metodo di quell'oggetto?
xdevel2000,

28
Ehm, non esattamente. Ogni oggetto ha automaticamente un monitor (mutex) associato ad esso, indipendentemente da qualsiasi altra cosa. Quando si dichiara un metodo sincronizzato, si dichiara che il runtime deve ottenere il blocco sul monitor dell'oggetto prima che inizi l'esecuzione di quel metodo (e che deve rilasciare il blocco prima che il controllo ritorni al codice chiamante).
Andrzej Doyle,

31
E @Pablo - non esiste un monitor per un metodo; i monitor esistono solo per gli oggetti, che sarebbero l'istanza che racchiude la maggior parte dei metodi o l' Classoggetto corrispondente per i metodi statici. Se hai già un method1 () sincronizzato e dichiari method2 () sincronizzato, non vengono creati nuovi monitor e infatti invocando uno dei due metodi (sullo stesso oggetto) tenterai di bloccare lo stesso monitor. Questo spesso attira i nuovi arrivati.
Andrzej Doyle,

1
@Andrzej: quindi ad ogni oggetto è associato UN SOLO monitor. Quindi posso avere molti metodi sincronizzati. Dopo ogni volta che uno di questi metodi chiama un thread, ottiene quel monitor che esegue la sincronizzazione.
xdevel2000,

1
ho solo bisogno di chiarire questo ... l'oggetto che viene usato per chiamare un blocco sincronizzato nel thread 1 può essere usato di nuovo in un altro thread (thread 2) per chiamare il metodo normale (non sincronizzato) allo stesso tempo?

27

Un monitor è un'entità che possiede sia un blocco che un set di attesa . In Java, qualsiasiObject può fungere da monitor.

Per una spiegazione dettagliata di come funzionano i monitor in Java, ti consiglio di leggere la sezione Meccanica dei monitor di Programmazione concorrente in Java (il link precedente mostra l'anteprima nei libri di Google e quella sezione è disponibile per la lettura).


Come hai detto "Un monitor è un'entità ..", significa che il monitor è un oggetto / stato interno che possiede / tiene traccia del blocco e dei waititset? In caso contrario, puoi elaborare qui Entity? Fondamentalmente quando java doc dice Wakes up all threads that are waiting on this object's monitor. di notificationall (), quello che ottengo è l'oggetto sta mantenendo (con l'aiuto dell'entità / oggetto interno) ciò che tutti i thread sono in attesa di blocco, quell'entità / oggetto interno si chiama monitor?
user3198603

Risposta più utile. Grazie @JRL.
gravetii,

Per me dice: "Nessuna anteprima disponibile per questa pagina".
opncow

9
  1. Un monitor è un concetto / meccanismo che non si limita al linguaggio Java;
  2. "Nella programmazione concorrente, un monitor è un oggetto o un modulo destinato ad essere utilizzato in sicurezza da più di un thread";
  3. Come tutti i lettori sanno, ogni oggetto in Java è una sottoclasse di java.lang.Object. La gente di java ha creato java.lang.Object in modo tale che abbia caratteristiche e caratteristiche che consentano ai programmatori Java di utilizzare qualsiasi oggetto come monitor. Ad esempio, ogni oggetto ha una coda di attesa, una coda di rientro e metodi di attesa e notifica che lo rendono un monitor;
  4. leggi qui sui monitor .

4

Il linguaggio Java e il sistema di runtime supportano la sincronizzazione dei thread mediante l'uso di monitor.
Un monitor è associato a un elemento di dati specifico (una variabile di condizione) e funge da blocco su tali dati. Quando un thread contiene il monitor per alcuni elementi di dati, altri thread vengono bloccati e non possono ispezionare o modificare i dati.



2

Monitor è un costrutto di sincronizzazione che consente ai thread di avere sia l'esclusione reciproca sia la capacità di attendere (bloccare) che una determinata condizione diventi realtà.

I monitor hanno anche un meccanismo per segnalare ad altri thread che le loro condizioni sono state soddisfatte. È un'entità che possiede sia un blocco che un set di attesa. In Java, qualsiasi oggetto può fungere da monitor.

Nella macchina virtuale Java, ogni oggetto e classe è logicamente associato a un monitor. Per implementare la capacità di esclusione reciproca dei monitor, un blocco (a volte chiamato mutex) è associato a ciascun oggetto e classe. Questo è chiamato semaforo in termini di sistemi operativi, mutex è un semaforo binario.

Per maggiori informazioni controlla il link


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.