2013-01-24 14 views
21

Eventuali duplicati:
Java Synchronized Block for .classsincronizzare (questo) vs sincronizzazione (MyClass.class)

Stavo leggendo attraverso un article sulla sincronizzazione. Sono confuso sotto i punti e ho bisogno di ulteriori chiarimenti

1) Per il blocco di sincronizzazione. Come

synchronize(this){ 
    // code 
    } 

differisce da

synchronize(MyClass.class){ 
    //code 
    } 

2) Sincronizzazione metodo istanza significa discussioni dovranno ottenere blocco esclusivo sul esempio, mentre la sincronizzazione metodo statico mezzi a filo dovrà acquisire un blocco su tutta la classe (correggimi se sbaglio). Quindi se una classe ha tre metodi e uno di questi è statico sincronizzato, se un thread acquisisce il lock su quel metodo significa che acquisirà il lock su tutta la classe, quindi vuol dire che anche gli altri due verranno bloccati e nessun altro metodo sarà in grado di accedere a questi due metodi mentre l'intera classe sta avendo il blocco?

risposta

24

MyClass.class e this sono cose diverse, sono riferimenti diversi a oggetti diversi.

this - è il riferimento a particolari questa istanza di classe, e

MyClass.class - è il riferimento MyClass descrizione dell'oggetto.

blocchi

Questa sincronizzazione differisce dal fatto che il primo sarà sincronizzare tutti i fili che si occupano concretamente con questo istanza di MyClass, e la seconda si sincronizzerà tutte fili indipendentemente quale oggetto su cui questo metodo è stato chiamato.

9

Il primo esempio (acquisizione del blocco su this) deve essere utilizzato nei metodi di istanza, il secondo (acquisizione del blocco su oggetto class) nei metodi static.

Se un thread acquisisce il blocco su MyClass.class, altri thread dovranno attendere per immettere il blocco sincronizzato di un metodo static in cui si trova questo blocco. Nel frattempo, tutti i thread saranno in grado di acquisire il blocco per una particolare istanza di questa classe ed eseguire i metodi di istanza.

+0

solo le vars delle classi statiche saranno bloccate con synchronize (MyClass.class) giusto? – tgkprog

+0

@tgkprog Non si sincronizzano le variabili da sé, si sincronizza l'accesso ad esse (tramite metodi). 'MyClass.class' è solo un oggetto ed è possibile (anche se non riesco a immaginare il caso reale quando sarebbe necessario) per sincronizzare anche i metodi di istanza, ma in generale questo paradigma viene utilizzato con metodi statici. –

+0

hmm pensavo che sincronizzare (MyClass.class) bloccasse solo le variabili statiche dichiarate nella classe. dovrà cercare. Quindi dicendo che se avessi 1.000 istanze della mia classe, ognuna con 100 variabili, sarebbero tutte bloccate? – tgkprog