2010-01-27 15 views

risposta

4

Vector è considerato "thread-safe" perché l'accesso agli interni del vettore è sincronizzato. Metodi come add(), get(), size(), ecc., Sono tutti sincronizzati in modo tale che le modifiche alla struttura interna di Vector e l'accesso a quella struttura interna non possono essere elaborati contemporaneamente da thread separati.

16

Viene reso "thread-safe" in base al merito di tutti i suoi metodi sincronizzati (tramite la parola chiave sincronizzata), vedere OpenJDK source code.

Ciò che la parola chiave sincronizzata fa è che impedisce a più thread di eseguire uno qualsiasi dei metodi sincronizzati allo stesso tempo. Sta usando un blocco internamente, che un thread deve ottenere quando si immette di quei metodi e che il thread si rilascia quando lascia il metodo.

Si noti che questo non aiuta molto, perché mentre impedisce lo stato interno incoerente del vettore, ciò non garantisce in alcun modo un livello di coerenza a un livello superiore (un livello utile per un'applicazione).

Considerate questo esempio che dimostra che è ancora necessario utilizzare la sincronizzazione nel codice dell'applicazione (in modo che si potrebbe altrettanto bene è utilizzato l'ArrayList non sincronizzato):

// BROKEN CODE, needs external synchronization 
// only add an element if the vector is empty 
if(vector.isEmpty()) 
    vector.add(anElement); 
+0

+1 ma è necessario correggere "Ciò che fa la parola chiave sincronizzata è che impedisce a più thread di eseguire il metodo contemporaneamente". Non è solo l'accesso al metodo specifico che è bloccato. – Fredrik

+0

@Fredrik: Grazie. Ho provato a correggere la frase senza che diventasse troppo complessa. Suppongo che un collegamento a una spiegazione più lunga sarebbe in ordine. – Thilo

+0

Ho capito bene, che nel codice, che hai fornito, il 'vector' avrebbe potuto essere alterato (diventare non vuoto) prima di' vector.add (anElement); '? – soshial

0

Si prega di trovare i brani sotto da API Java

Innanzitutto, non è possibile che due invocazioni di metodi sincronizzati sullo stesso oggetto si alternino. Quando un thread sta eseguendo un metodo sincronizzato per un oggetto, tutti gli altri thread che invocano metodi sincronizzati per lo stesso blocco oggetto (sospendi l'esecuzione) finché il primo thread non viene eseguito con l'oggetto.

In secondo luogo, quando un metodo sincronizzato viene chiuso, stabilisce automaticamente una relazione prima-evento con qualsiasi successiva chiamata di un metodo sincronizzato per lo stesso oggetto. Ciò garantisce che le modifiche allo stato dell'oggetto siano visibili a tutti i thread.

Problemi correlati