2013-03-06 7 views
6

Ho una codifica come questa.Come possedere il monitor dell'oggetto

public class WaitTest { 

    public static void main(String[] args) { 
    Object object = new Object(); 
    try { 
     synchronized (object) { 
     object.wait(5000); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

funziona utilizzando sincronizzato (oggetto) significa classe WaitTest è possedere il monitor di oggetto?

+0

Il thread principale è l'unico proprietario del blocco 'object'. Le classi non possono possedere serrature, i fili possono. –

risposta

8

Le classi non possiedono monitor, le discussioni fanno.

Nell'esempio, WaitTest non possiede il monitor, il thread principale.

In particolare, nessun altro thread sarebbe in grado di entrare in un blocco synchronized sullo stesso oggetto, compresi chiamare qualsiasi dei metodi synchronized s' il object, se avesse tali metodi.

+1

** usando sincronizzato (oggetto) significa ** che il thread principale è proprietario del monitor oggetto, non è vero? – bsiamionau

+0

@zvzdhk: buona presa, non ho notato questo sottile fraintendimento quando ho letto la domanda. – NPE

+1

Adesso va molto meglio. +1 – bsiamionau

0

Il filo possiede il monitor, e ci sono tre modi per possedere il monitor, in base al documento ufficiale di JDK qui: Object.notify

Un filo diventa il proprietario del monitor del oggetto in uno dei tre modi:

  • Eseguendo un metodo di istanza sincronizzato di tale oggetto.
  • Eseguendo il corpo di un'istruzione sincronizzata che si sincronizza sull'oggetto.
  • Per oggetti di tipo Classe, eseguendo un metodo statico sincronizzato di tale classe.