Qual è il significato del monitor di un oggetto in Java? Perché usare questa parola?


87

Quando leggo articoli sui thread Java, noto spesso l'espressione: "il thread corrente è il proprietario del monitor di questo oggetto". Capisco il significato: il filo ha il diritto di operare sull'oggetto. Ma sono perplesso perché usiamo la frase "il monitor dell'oggetto" invece di "il blocco dell'oggetto"?

In breve, non conosco il significato della parola "monitor". La domanda può essere strana e semplice. Ma vorrei che qualcuno potesse aiutarci a risolverlo. 3ks


1
+1 @ulmangt per essere stato l'unico a rispondere effettivamente alla tua domanda: li chiamiamo "monitor" perché è così che li chiamava Hoare nel 1974.
Solomon Slow

Risposte:


52

ma sono perplesso perché usare la parola "monitor dell'oggetto" invece di "blocco dell'oggetto"?

Vedere la risposta di ulmangt per i collegamenti che spiegano il termine "monitor" utilizzato in questo contesto. Nota che:

"I monitor sono stati inventati da Per Brinch Hansen e CAR Hoare e sono stati implementati per la prima volta nel linguaggio Concurrent Pascal di Brinch Hansen."

(Fonte: Wikipedia )

Perché usare il termine "monitor" invece di "lock"? Beh, in senso stretto, i termini significano cose diverse ... specialmente se li usi nel modo in cui erano originariamente intesi per essere usati.

  • Un "blocco" è qualcosa con acquisire e rilasciare primitive che mantengono determinate proprietà di blocco; es. uso esclusivo o scrittore singolo / lettore multiplo.

  • Un "monitor" è un meccanismo che garantisce che un solo thread possa eseguire una determinata sezione (o sezioni) di codice in un dato momento. Ciò può essere implementato utilizzando un blocco (e "variabili di condizione" che consentono ai thread di attendere o inviare notifiche ad altri thread che la condizione è soddisfatta), ma è più di un semplice blocco. Infatti, nel caso Java, il blocco effettivo utilizzato da un monitor non è direttamente accessibile. (Non puoi dire "Object.lock ()" per impedire ad altri thread di acquisirlo ... come puoi fare con Lockun'istanza Java .)

In breve, se uno dovesse essere pedante "monitor" è in realtà un termine migliore di "blocco" per caratterizzare ciò che Java sta fornendo. Ma in pratica, entrambi i termini sono usati quasi in modo intercambiabile.



10

Citazione da Inside the Java Virtual Machine

Un thread nella Java virtual machine richiede un blocco quando arriva all'inizio di una regione di monitoraggio. In Java, esistono due tipi di aree di monitoraggio: istruzioni sincronizzate e metodi sincronizzati.

Tenere sotto controllo

Un monitor è come un edificio che contiene una stanza speciale che può essere occupata da un solo thread alla volta. La stanza di solito contiene alcuni dati. Dal momento in cui un thread entra in questa stanza fino a quando esce, ha accesso esclusivo a tutti i dati nella stanza. Entrare nell'edificio del monitor è chiamato "entrare nel monitor". L'ingresso nella stanza speciale all'interno dell'edificio è chiamato "acquisizione del monitor". Occupare la stanza si chiama "possedere il monitor" e lasciare la stanza si chiama "rilasciare il monitor". L'uscita dall'intero edificio viene chiamata "uscita dal monitor".

Oltre ad essere associato a un po 'di dati, un monitor è associato a uno o più bit di codice, che in questo libro verranno chiamati regioni di monitoraggio.

Come accennato in precedenza, il linguaggio fornisce due modi incorporati per identificare le aree di monitoraggio nei programmi: istruzioni sincronizzate e metodi sincronizzati. Questi due meccanismi, che implementano l'aspetto di mutua esclusione della sincronizzazione, sono supportati dal set di istruzioni della macchina virtuale Java.

Serratura

Per implementare la capacità di mutua esclusione dei monitor, la Java virtual machine associa un blocco (a volte chiamato mutex) a ogni oggetto e classe. Un blocco è come un privilegio che solo un thread può "possedere" alla volta.

Un singolo thread può bloccare più volte lo stesso oggetto. Per ogni oggetto, la Java virtual machine mantiene un conteggio del numero di volte in cui l'oggetto è stato bloccato. Un oggetto sbloccato ha un conteggio pari a zero. Quando un thread acquisisce il blocco per la prima volta, il conteggio viene nuovamente incrementato a uno. Ogni volta che il thread acquisisce un blocco sullo stesso oggetto, il conteggio viene nuovamente incrementato.


6

Un synchronizedblocco attorno a un objectè il suo monitor, che controlla un blocco sull'oggetto. Qui un esempio

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

4

Anche se è tardi per rispondere a questa domanda, ho pensato di aggiungere solo nel caso fosse utile.
Ecco un blocco sincronizzato di codice Java all'interno di un metodo Java non sincronizzato

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

Nell'esempio viene utilizzato "this", che è l'istanza su cui viene chiamato il metodo add. Un metodo di istanza sincronizzato utilizza l'oggetto a cui appartiene come oggetto monitor.
=> Solo un thread può essere eseguito all'interno di un blocco di codice Java sincronizzato sullo stesso oggetto monitor.


3

La Java Virtual Machine utilizza i monitor per supportare il multithreading. I monitor raggiungono questo obiettivo attraverso due concetti: esclusione reciproca durante l'esecuzione dei thread (qui è dove entra in gioco il "blocco") e coordinamento come mezzo di comunicazione tra thread (qui è dove entrano in scena i metodi di attesa e notifica dell'oggetto).

Leggere la parte seguente da "Inside JVM" chiarirà questo dubbio, è spiegato molto bene qui (Capitolo 20, Sincronizzazione dei thread) -

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

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.