kar*_*oma 6 java lambda multithreading thread-safety
我正在尝试更新一些代码以使用lambda表达式但我在保持线程安全方面遇到了一些麻烦.
我有多个线程在运行,最终调用以下回调,它有一个synchronized方法可以向a添加一些结果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);
}
};
Run Code Online (Sandbox Code Playgroud)
然而,当我将它转换为lambda表达式时,我丢失了synchronized关键字,我不完全确定如何将其恢复.每当我运行代码时,我现在都会收到NullPointerException.
final MapCallback<Integer, Document> mapCallback = (int file, List<Document> results) -> mappedDocs.addAll(results);
Run Code Online (Sandbox Code Playgroud)
如何让这个线程再次安全?
ass*_*ias 11
您可以在不同的监视器上同步它,例如:
final MapCallback<Integer, Document> mapCallback = (int file, List<Document> results) -> {
synchronized(mappedDocs) {
mappedDocs.addAll(results);
}
};
Run Code Online (Sandbox Code Playgroud)
或者使用线程安全结构,例如CopyOnWriteArrayList或BlockingQueue.