【发布时间】:2014-11-04 20:24:54
【问题描述】:
我正在尝试更新一些代码以使用 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);
我怎样才能使这个线程再次安全?
【问题讨论】:
-
你不能不使用 lambda 吗?
-
@jtahlborn 我可以。只是我的 IDE 告诉我可以用 lambda 替换它,所以我想我会尝试。
-
我将使用no(请参阅此处没有提及“同步”)。
-
我认为这是 IDE 中的一个错误,它允许您执行此重构而不会警告您它正在丢弃同步。
-
如果它必须被同步,那么你正在调用对象的某些方法或类的静态方法。因此,您可以简单地对该对象或类使用锁定,例如 the accepted answer 中建议的 assylias。
标签: java multithreading lambda thread-safety