quando si ottiene un NoSuchElementException
allora questo forse a causa di non sincronizzare correttamente. Ad esempio: stai verificando con it.hasNext()
se un elemento è presente nell'elenco e successivamente prova a recuperarlo con it.next()
. Ciò potrebbe non riuscire quando l'elemento è stato rimosso in mezzo e ciò può anche accadere quando si utilizzano versioni sincronizzate dell'API di raccolta.
Quindi il problema non può realmente essere risolto con lo spostamento a ConcurrentLinkedQueue
. Non è possibile ottenere un'eccezione, ma è necessario essere pronti a restituire null
anche se si è verificato che non è vuoto. (Questo è ancora lo stesso errore ma l'implementazione è diversa.) Questo è vero finché non c'è una sincronizzazione corretta nel TUO codice che ha i controlli per la vacuità e il recupero degli elementi nell'ambito SAME sincronizzato.
C'è una buona probabilità che si scambi NoSuchElementException
per avere nuovo NullPointerException
in seguito.
Questa potrebbe non essere una risposta indirizzata direttamente alla tua domanda sulle prestazioni, ma avere NoSuchElementException
in LinkedList come motivo per passare a ConcurrentLinkedQueue
suona un po 'strano.
Modifica
Alcuni pseudo-codice per le implementazioni di rotte:
//list is a LinkedList
if(!list.isEmpty()) {
... list.getFirst()
}
Alcuni pseudo-codice per una corretta sincronizzazione:
//list is a LinkedList
synchronized(list) {
if(!list.isEmpty()) {
... list.getFirst()
}
}
del codice per la sincronizzazione "rotto" (fa non funziona come previsto). Questo potrebbe essere il risultato del passaggio diretto da LinkedList a CLQ nella speranza di eliminare la sincronizzazione da solo.
//queue is instance of CLQ
if(!queue.isEmpty()) { // Does not really make sense, because ...
... queue.poll() //May return null! Good chance for NPE here!
}
Alcuni codice appropriato:
//queue is instance of CLQ
element = queue.poll();
if(element != null) {
...
}
o
//queue is instance of CLQ
synchronized(queue) {
if(!queue.isEmpty()) {
... queue.poll() //is not null
}
}
fonte
2011-09-06 08:42:32
Molto simile al http://stackoverflow.com/questions/4724995/lock-free-concurrent-linked-list- in-java. –