使用lambda保持线程安全

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.