2010-07-12 15 views
9

Ho due metodi sincronizzati in una classe, diciamo method1() e method2(). Un thread dice "Thread 1" mantiene il lock su quell'oggetto della classe eseguendo il metodo sincronizzato 1(). Può un altro thread dire "Thread 2", accedere al lock tramite method2() nello stesso momento mentre "Thread 1" tiene la serratura.due diversi metodi sincronizzati dello stesso oggetto?

Questo caso è analogo alla classe java.util.Vector che ha metodi sincronizzati add() e remove(). Spiega anche questo caso.

risposta

10

No. Il metodo synchronized in Java è identico all'intero metodo con il corpo avvolto in un blocco synchronized (this). Pertanto, se un thread è in un metodo synchronized, un altro thread non può essere contemporaneamente in un diverso metodo sullo stesso oggetto.

Il modo in cui questo si riferisce a un Vector è che non si desidera che il codice tenti di rimuovere un elemento mentre un altro codice sta tentando di aggiungere un elemento. Questo è il concetto di una sezione critica ; non solo non vuoi che qualcun altro cerchi di fare quello che stai facendo, ma non vuoi che qualcun altro faccia qualcosa di diverso che interferisca.

+0

Grazie Borealid .. Ma se questo è il caso, perché Java fornisce la sincronizzazione specifica per i metodi, si può solo forniti per la l'intera classe? – JavaUser

+1

@JavaUser: 'synchronized (this)' non significa che l'intera classe è 'sincronizzata'. Significa che acquisisci il blocco Oggetto dell'istanza su cui è stato chiamato il metodo. Non vuoi necessariamente * tutti * i metodi per essere 'sincronizzati '(infatti, lo farai raramente). Per ottenere le prestazioni del codice multithreading è necessario utilizzare il minor numero di blocchi possibile preservando la correttezza del programma - ogni volta che si ha un blocco conteso, alcuni thread attenderanno, senza fare nulla. – Borealid

+0

@ Borealid ... nel momento in cui ho definito sincronizzato in qualsiasi metodo, l'intero oggetto è bloccato quando chiamo quel metodo ..am I right? – JavaUser

3

Il thread2 può accedere al blocco ma non può accedere al blocco protetto da tale blocco finché Thread1 mantiene lo stesso blocco.

+0

che è stato utile. Grazie! – peakit

Problemi correlati