java – 使用lambda保持线程安全

前端之家收集整理的这篇文章主要介绍了java – 使用lambda保持线程安全前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试更新一些代码以使用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.

原文链接:https://www.f2er.com/java/127151.html

猜你在找的Java相关文章