2013-02-05 14 views
5

Ho una lista di string (tagList) che deve essere condivisa tra più thread per la lettura, quindi ne creo una versione non modificabile e la passerò ai thread, non sono sicuro che sia thread-safe, poiché i thread leggono solo quell'elenco così Immagino che dovrebbe essere ok?è unmodifiableList thread safe?

anche quando passo la lista non modificabile ai thread, passa una singola copia e condivisa da thread o crea più copie e ne passa una copia a ciascun thread?

Ecco il mio codice:

final List<String> tList = Collections.unmodifiableList(tagList); 
List<Future<Void>> calls = new ArrayList<Future<Void>>(); 

FileStatus[] fsta = _fileSystem.listStatus(p);  
for (FileStatus sta : fsta) { 
    final Path path = new Path(sta.getPath(), "data.txt"); 
    if (!_fileSystem.exists(path)) {   
     continue; 
    } 
    else { 
     calls.add(_exec.submit(new Callable<Void>() { 
      @Override 
      public Void call() throws Exception { 
       filterData(path, tList); 
       return null; 
      } 
     })); 
    } 
} 
+1

È thread-safe. – jdb

risposta

6

Questo dipende completamente dalla presenza dell'elenco sottostante sicuro da thread durante le operazioni di lettura. L'elenco non modificabile passa semplicemente tutte le chiamate lette, come size(), ecc. All'elenco sottostante senza sincronizzazione aggiuntiva.

Immaginate, ad esempio, l'implementazione di List che memorizza il codice hash invece di calcolarlo ogni volta che è necessario. Per tale implementazione, il metodo hashCode() non è in realtà di sola lettura, poiché potrebbe modificare il valore del codice hash memorizzato nella cache internamente.

Un altro esempio è un aroma di LinkedList che memorizza nella cache l'ultima voce accessibile insieme all'indice, quindi ulteriori tentativi di accesso agli elementi vicini verranno eseguiti molto più rapidamente. Per tale implementazione, il metodo get (int) non sarà di sola lettura poiché aggiorna il riferimento e l'indice memorizzati nella cache e, pertanto, probabilmente non sarà thread-safe.

+1

E la sottostante 'Lista' potrebbe essere modificata. Presumibilmente anche non sicuro se pubblicato in modo non sicuro. –

+0

Il fatto che l'elenco sottostante possa essere modificato non ha nulla a che fare con la sicurezza del thread. –

+3

Non seguo. Se il sottostante 'List' è in corso di modifica in un thread diverso rispetto a' unmodifiedList' viene letto, questo sarà un accesso multithreading anche se l'operazione di lettura sull''elenco sottostante 'non causa alcuna modifica interna. –

2

E 'thread-safe (dal momento che non può essere modificato). Passa la stessa copia in giro.

Tuttavia, l'Elenco fascicolato (tagList) non è ancora thread-safe. Non è necessario modificare l'Elenco avvolto mentre è condiviso. L'unica ragione per cui l'elenco restituito da unmodifiableList() è sicuro è perché le modifiche non sono consentite attraverso l'Elenco compresso.

0

Come dici che la lista non è modificabile; quindi sarà thread sicuro.

Quando si passa un oggetto si passa effettivamente il riferimento all'oggetto (e non all'oggetto effettivo). Poiché esiste una singola copia e non viene modificata, rimane protetta da thread.

Una sola avvertenza; mai accedere a tagList direttamente. Accedilo sempre tramite la raccolta non modificabile incapsulata denominata tList. Questo può essere ottenuto se lo si incapsula correttamente.