cosa si intende per vettore in Java è thread-safe e sincronizzato, come è fatto thread-safe. Sto osservando i dettagli interni dell'implementazioneSincronizzazione nei vettori in Java
risposta
I metodi sono contrassegnati come synchronized
. Controlla lo Synchronized Method tutorial.
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.
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);
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.
- 1. Sincronizzazione Java in modalità singleton
- 2. hashtable e sincronizzazione in Java
- 3. Java: sincronizzazione su primitive?
- 4. sincronizzazione delle letture in una raccolta java
- 5. Singleton thread safe senza sincronizzazione in Java?
- 6. Prestazioni della sezione di sincronizzazione in Java
- 7. Come funziona la sincronizzazione in Java?
- 8. Sincronizzazione su un oggetto in Java
- 9. Sincronizzazione Java tra JVM diversi
- 10. pool di thread, dati condivisi, Java Sincronizzazione
- 11. classi java anonime e sincronizzazione e "questo"
- 12. Mockito con convertitore di sincronizzazione asincrono Java
- 13. Java - sincronizzazione di più thread in base allo step temporale
- 14. Realizza forzatamente la sincronizzazione/flush dei file in Java
- 15. Uso confuso di sincronizzazione in Java: pattern o anti-pattern?
- 16. Vettori condivisi in OpenMP
- 17. Come disegnare vettori (vettori fisici 2D/3D) in MATLAB?
- 18. .NET ThreadPool QueueUserWorkItem Sincronizzazione
- 19. Coltivare una Hashmap di vettori in Matlab
- 20. Ripetizione dei vettori in Clojure
- 21. Rbind due vettori in R
- 22. Generazione di vettori in MATLAB
- 23. mappa dei vettori in STL?
- 24. Sincronizzazione di una coda
- 25. Java Attenzione utilizzando vettori: chiamata incontrollato di aggiungere (E) po
- 26. Cosa significa "sincronizzazione incoerente"?
- 27. Sincronizzazione thread Java, migliore utilità simultanea, operazione di lettura
- 28. IMAP sincronizzazione
- 29. Java Singleton sincronizzazione per il multi-thread utilizzando HashMap
- 30. Sincronizzazione più thread in pitone
+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
@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
Ho capito bene, che nel codice, che hai fornito, il 'vector' avrebbe potuto essere alterato (diventare non vuoto) prima di' vector.add (anElement); '? – soshial