Sto cercando di aggiornare del codice per utilizzare le espressioni lambda, ma ho qualche problema a salvaguardare la sicurezza dei thread.Protezione della filettatura con lambda
Ho più thread in esecuzione che alla fine chiamano il seguente callback, che ha un metodo synchronized
che aggiunge alcuni risultati a un LinkedList
.
final List<Document> mappedDocs = new LinkedList<>();
final MapCallback<Integer, Document> mapCallback = new MapCallback<Integer, Document>() {
@Override
public synchronized void done(int file, List<Document> results) {
mappedDocs.addAll(results);
}
};
Tuttavia quando ho convertirla in un'espressione lambda perdo la parola synchronized
e io non sono del tutto sicuro di come tornare indietro. Ora sto ricevendo una NullPointerException ogni volta che eseguo il mio codice.
final MapCallback<Integer, Document> mapCallback = (int file, List<Document> results) -> mappedDocs.addAll(results);
Come posso rendere sicuro questo thread?
non puoi semplicemente non usare un lambda? – jtahlborn
@jtahlborn posso. È solo il mio IDE che mi sta dicendo che posso sostituirlo con un lambda, quindi ho pensato di provare. – karoma
ho intenzione di andare con [no] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27) (vedi nessun riferimento a "sincronizzato" lì dentro). – jtahlborn