2010-07-29 19 views
80

Che cos'è un monitor a cui si fa riferimento nella programmazione concorrente in Java?Che cos'è un monitor in Java?

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

È un oggetto speciale?

+7

+1 Questo mi ha fatto leggere come i monitor sono implementati a livello di JVM. Imparato qualcosa di nuovo i dettagli – naikus

+0

@naikus mi aspetto che condividono formano voi :) – roottraveller

risposta

50

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

Ciò permette di fare:

filettatura 1:

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

filettatura 2:

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

Questo impedisce Fili 1 e 2 di accesso sezione monitorata (sincronizzato) Allo stesso tempo. Uno inizierà e il monitor impedirà all'altro di accedere alla regione prima che il primo termini.

Non è un oggetto speciale. È il meccanismo di sincronizzazione collocato nella radice della gerarchia di classi: java.lang.Object.

Esistono anche i metodi wait e notify che utilizzeranno anche il monitor dell'oggetto per la comunicazione tra diversi thread.

+1

così possiamo dire che quando creiamo un metodo sincronizzato stiamo definendo una serratura (monitor) sul metodo di quell'oggetto? – xdevel2000

+0

Esattamente. Quando si usa un metodo sincronizzato (che non ho inserito nella mia risposta) si sta creando un monitor su quel metodo. –

+19

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

14

Un monitor è un'entità che possiede sia un serratura e wait set. In Java, qualsiasi Object può fungere da monitor.

Per una spiegazione dettagliata di come funzionano i monitor in Java, vi consiglio di leggere le Monitor Meccanica sezione del Concurrent Programming in Java (il link precedente visualizza l'anteprima in Google books, e che la sezione è disponibile per la lettura).

+0

Come hai detto "Un monitor è un'entità ..", significa che il monitoraggio è un oggetto/stato interno che possiede/traccia il blocco e il waitset? Se no, per favore, puoi elaborare Entity qui? Fondamentalmente quando java doc dice "Riattiva tutti i thread che stanno aspettando sul monitor di questo oggetto". A proposito di notifyall(), quello che ottengo è che l'oggetto sta mantenendo (con l'aiuto di entità/oggetto interno) che tutti i thread stanno aspettando il blocco, quell'entità/oggetto interno è chiamato monitor? – user3198603

5
  1. Un monitor è un concetto/meccanismo che non è limitato al linguaggio Java;
  2. "Nella programmazione concorrente, un monitor è un oggetto o modulo destinato ad essere utilizzato in modo sicuro da più di un thread";
  3. Come ogni lettore sa, ogni oggetto in Java è una sottoclasse di java.lang.Object. I java hanno 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 aspetta e notifica i metodi rendendolo un monitor;
  4. letto su monitor here.
3

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