我試圖更新一些代碼來使用lambda表達式,但我在保留線程安全方面遇到了一些麻煩。使用lambda保留線程安全性
我有多個線程正在運行,最終調用下面的回調函數,其中有一個方法,它將一些結果添加到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表達式我失去了關鍵字,我不完全知道如何把它找回來。每當我運行我的代碼時,我現在都會收到一個NullPointerException異常。
final MapCallback<Integer, Document> mapCallback = (int file, List<Document> results) -> mappedDocs.addAll(results);
我該如何讓這個線程再次安全?
你不能不使用拉姆達? – jtahlborn 2014-11-04 20:28:21
@jtahlborn我可以。這只是我的IDE告訴我,我可以用lambda取代它,所以我想我會嘗試。 – karoma 2014-11-04 20:29:53
我打算使用[no](http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27)(請參閱不參考「同步」在那裏)。 – jtahlborn 2014-11-04 20:34:58