Recentemente stavo scrivendo un programma concorrente in Java e ho trovato il dilemma che stava per svanire: supponiamo di avere una struttura dati globale, che è parte di una normale libreria non sincronizzata, non simultanea come HashMap. Va bene consentire a più thread di scorrere l'insieme (solo leggendo, senza modifiche), magari in periodi diversi, intercalati, cioè thread1 potrebbe essere a metà strada per iterare quando thread2 ottiene il suo iteratore sulla stessa mappa?Più thread che iterano sulla stessa mappa
risposta
È OK. La capacità di farlo è la ragione per creare tale interfaccia come iteratore. Ogni thread che itera su una raccolta ha una sua istanza di iteratore che mantiene il suo stato (ad esempio, dove ci si trova ora nel processo di iterazione).
Ciò consente a più thread di scorrere simultaneamente sulla stessa raccolta.
I problemi sorgono solo quando si tentano modifiche simultanee su una struttura di dati.
Ad esempio, se un thread sta iterando sul contenuto di una mappa e un altro thread cancella gli elementi da quella raccolta, si andrà verso un problema serio.
Se sono necessari alcuni thread per modificare tale raccolta in modo sicuro, Java fornisce meccanismi per farlo, ovvero ConcurrentHashMap.
C'è anche Hashtable, che ha la stessa interfaccia HashMap, ma è sincronizzato, anche se il suo uso non è consigliato attualmente (sconsigliato), in quanto la sua prestazione soffre quando il numero di elementi diventa più grande (rispetto a ConcurrentHashMap che non ha bisogno di bloccare l'intera Collezione).
Se si dispone di una raccolta che non è sincronizzata e è necessario disporre di più thread di lettura e scrittura su di essa, è possibile utilizzare Collections.synchronizedMap (Map) per ottenere una versione sincronizzata di esso.
Dovrebbe andare bene, finché non ci sono scrittori.
Questo problema è simile a readers-writer lock, in cui più lettori sono autorizzati a leggere dai dati, ma non durante il periodo in cui uno scrittore "ha" il blocco per esso. Non vi è alcun problema di concorrenza per i multipli letti contemporaneamente. [data race si può verificare solo quando si ha almeno una scrittura].
Le risposte di cui sopra sono certamente un buon consiglio. In generale, quando si scrive Java con thread simultanei, purché non si modifichi una struttura dati, non è necessario preoccuparsi di più thread che leggono contemporaneamente quella struttura.
In caso di problemi simili in futuro, tranne che la struttura dati globale potrebbe essere modificata contemporaneamente, suggerirei di scrivere una classe Java che tutti i thread utilizzano per accedere e modificare la struttura. Questa classe potrebbe implementare la propria metodologia di concorrenza, utilizzando metodi sincronizzati o blocchi. Il tutorial Java ha un'ottima spiegazione dei meccanismi di concorrenza di Java. L'ho fatto personalmente ed è abbastanza semplice.
- 1. scrittura di più thread sulla stessa booleana
- 2. Prese Java: più thread client sulla stessa porta sulla stessa macchina?
- 3. Creazione di più thread sulla stessa unità hardware
- 4. Più contenuto_for sulla stessa pagina
- 5. più tabelle sulla stessa riga
- 6. VIM - più comandi sulla stessa linea
- 7. Highcharts.js - più temi sulla stessa pagina?
- 8. Impostazione di più truststore sulla stessa JVM
- 9. Regex più corrispondenze sulla stessa linea
- 10. Più connessioni socket.io sulla stessa pagina
- 11. Più ruoli di lavoro sulla stessa istanza
- 12. mediaelement.js Più video sulla stessa pagina?
- 13. Più thread chiamando la stessa funzione
- 14. Tracciare percorsi tra più punti sulla mappa
- 15. Chiama recv() sulla stessa presa di blocco da due thread
- 16. Marcatori multipli sulla stessa coordinata
- 17. Operazioni sulla mappa parallela?
- 18. L'aggiunta di più sovrapposizioni sulla visualizzazione mappa richiede più tempo
- 19. Dichiarazione di variabili di istanza che iterano su un hash!
- 20. In che modo la classe serversocket serve più connessioni client sulla stessa porta?
- 21. Mappa thread-safe C++
- 22. Indicatori sulla mappa reattiva
- 23. Continua l'output sulla stessa riga
- 24. Utilizzando l'interfaccia generica più volte sulla stessa classe
- 25. Rails: gestione di più fusi orari diversi sulla stessa richiesta
- 26. Python: più chiamate a __init __() sulla stessa istanza
- 27. MultiCast Messaggi a più client sulla stessa macchina
- 28. Più DataTable sulla stessa pagina con diverse fonti Ajax
- 29. Angolare 2 Più di un componente sulla stessa pagina
- 30. TopShelf installa più dello stesso servizio sulla stessa macchina
Come dici tu, i thread hanno iteratori diversi. Dal momento che non sono condivisi, non ci sono problemi. –
Grazie ragazzi, ottime risposte! – Bober02