加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用lambda保持线程安全

发布时间:2020-12-14 23:55:20 所属栏目:Java 来源:网络整理
导读:我正在尝试更新一些代码以使用lambda表达式但我在保持线程安全方面遇到了一些麻烦. 我有多个线程运行,最终调用以下回调,它有一个synchronized方法,将一些结果添加到LinkedList. final ListDocument mappedDocs = new LinkedList();final MapCallbackInteger,
我正在尝试更新一些代码以使用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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读