更新要素が不可分のJava 8の並列ストリームを使用して地図から検索します

SS」:

私は要素を変異させる地図を使用していた並列ストリームを持っています。

Map<Long, List<MyItem>> hashmap = foo.getMap();

itemStream.parallel()
  .filter(Objects::nonNull)
  .forEach(item -> setProperties(hashmap, item));

方法「のsetProperties()は」アイテムを使用してマップアイテム、及び実行GETを受け取り、その項目のいくつかの属性を設定します。

取得/プロパティの設定がアトミックに行われるためには何を私が欲しいのです。だから、2つのスレッドが同じキーに対してgetを実行し、プロパティの更新をインタリーブすることはできません。

private void setProperties(Map<Long, List<Item>> map, Item item) {
    long id = item.getID();
    List<Object1> items = map.get(id);
    for (Object1 ob : items) {
            ob.setId(item.getFloorId());
            ob.setPath(item.getPath());
            ob.setTypeName(item.getTypeName());
    }
}

また、並列化のこの種の待ち時間のヒットについてのかどうか心配ビットは本当に既存のシングルスレッドアプローチ対利点を持つことになります。

ボヘミアン:

何の競合状態がありませんので、マップが変更されていないので、それから、地図やGETをSynchnorisingすることは、何のメリットがありません。

あなたは同期させる必要があり、更新を、彼らはすべてのアットワンス起こるよう:

for (Object1 ob : items) {
    synchronized (ob) {
        ob.setId(item.getFloorId());
        ob.setPath(item.getPath());
        ob.setTypeName(item.getTypeName());
    }
}

これらの日は非常にわずかなオーバーヘッドが導入を同期するので、これは、パフォーマンスにほとんど影響を与えますし、同じ場合にのみブロックします項目は、上の操作されています。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=185707&siteId=1