Problemi di più thread che condividono / accedono agli stessi dati [chiuso]

6

Ho fatto ricerche su quando i dati sono accessibili o condivisi da più thread all'interno di Java. E esaminando i problemi come:

  • Interferenza del thread
  • Consistenza della memoria
  • Deadlock
  • Starvation

Da questo, soluzioni per risolvere questi problemi.

Finora tutto ciò che mi sembra di risolvere questi problemi è utilizzando un metodo di sincronizzazione. Ci sono altre alternative all'utilizzo di un metodo di sincronizzazione?

Ho trovato la maggior parte di queste informazioni dal tutorial di Sun Java. Qualche raccomandazione su ulteriori letture?

    
posta Frank_B 29.02.2012 - 14:15
fonte

4 risposte

10

Esistono molte tecniche che non richiedono la sincronizzazione esplicita.

Ad esempio, se si mantengono tutti i dati locali in ciascun thread e si comunica solo tramite messaggi di passaggio, la sincronizzazione viene eseguita implicitamente inviando e in attesa di messaggi.

I

il passaggio dei messaggi hanno il vantaggio di essere scalabili molto bene, poiché non richiedono un architettura di memoria unificata e ci sono tecniche formali per il rilevamento e la prevenzione del deadlock, ad esempio La comunicazione di processi sequenziali (CSP) ti aiuta a ragionare formalmente su tali sistemi.

Un'altra opzione è l'uso di set di dati immutabili. Se nulla può cambiare, non hai mai bisogno di sincronizzarti, perché non ci sarà mai la possibilità che più di un thread proverà a scrivere contemporaneamente.

Puoi persino combinarli, se un processo crea insiemi di dati di memoria condivisa immutabili, può utilizzare i messaggi per passare i puntatori ai consumatori di tali dati.

Infine, potresti pensare in termini di livelli più alti di astrazioni. Unisci i tuoi processi insieme BlockingQueue da java.util.concurrent e non è necessario pensare al l'effettiva implementazione della coda, tu li produci solo con un processo e li consumi in un altro.

C'è anche un livello più basso di astrazione rispetto a synchronized , usando le primitive come Semaphor .

Nel complesso, è un'area ricca e profonda da studiare, e comprendere i pro e i contro di ciascuna tecnica ha il potenziale per renderti un programmatore migliore.

    
risposta data 29.02.2012 - 14:53
fonte
4

Consiglierei di esaminare l'uso di oggetti immutabili per dati condivisi. Per quanto possibile, cerca di limitare l'accesso ai dati mutati a un singolo thread.

Alcuni dei vantaggi:

  • nessun problema con la coerenza della memoria o l'interferenza dei thread poiché i dati condivisi non possono essere modificati
  • non è necessario utilizzare i metodi sincronizzati

Possibili svantaggi:

  • non può aggiornare un oggetto immutabile
  • meno efficiente se devi creare spesso nuove copie invece di aggiornare
risposta data 29.02.2012 - 14:34
fonte
4

Dovresti controllare il pacchetto java.util.concurrent di Java SE. Ci sono molte opzioni per mantenere le cose sincronizzate. Se questo non funziona, Google Guava ha alcune interessanti aggiunte a questo pacchetto.

    
risposta data 29.02.2012 - 14:40
fonte
1

Hai dato un'occhiata alle variabili atomiche?

link

L'autore dell'articolo Brian Geotz ha anche scritto un ottimo libro "Java Concurrency in practice"

    
risposta data 29.02.2012 - 14:45
fonte

Leggi altre domande sui tag