Come scrivere contemporaneamente dati in Java senza bloccare?

3

Come implementare un programma multi-thread in cui ogni thread ha bisogno di scrivere / trasmettere alcuni dati (in qualsiasi ordine, ovviamente) ma senza il sovraccarico di blocco che è coinvolto con i file o una particolare struttura di dati.

Ogni thread che scrive su un file separato è un'opzione fattibile? (per bloccare l'overhead)

Possiamo usare System.out.print o BufferWriter invece dei file? O c'è qualche altra soluzione elegante?

    
posta Outflanker 03.05.2015 - 04:42
fonte

1 risposta

1

Se ci sono più thread che generano dati indipendentemente l'uno dall'altro, scrivere in file separati può essere davvero una buona opzione. Ci sarà ancora un po 'di blocco sotto il cofano dal momento che il Sistema Operativo ha bisogno di mantenere il filesystem coerente, ma dovrebbe essere migliore della scrittura su un singolo file con blocco manuale o scrittura su output standard (che ha sincronizzazione interna). Analogamente, se si ha accesso ad un archivio online a cui è possibile accedere tramite la rete, è possibile inviare i dati indipendentemente da ogni thread.

Ma c'è un grande "ma". Se si scrivono molti dati (più di diversi MB / s, a seconda delle specifiche della macchina), il proprio file system potrebbe non essere in grado di tenere il passo. In tale situazione, il collo di bottiglia sarà il tuo file system e non i blocchi nell'app. Se ciò accade, potresti effettivamente stare meglio con un singolo file e bloccare poiché le scritture simultanee in più posizioni potrebbero caricare più carico sul file system e sul disco piuttosto che scrivere in un singolo punto. Quindi tutto dipende e qualsiasi numero di scritture concorrenti tra uno e molti potrebbe essere ottimale. La soluzione migliore sarebbe quella di rendere parametrizzabile il numero di scritture concorrenti e di confrontare le prestazioni finali dell'applicazione per diversi valori.

    
risposta data 03.05.2015 - 12:07
fonte

Leggi altre domande sui tag