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