从并发地图Unmodfiable读

如果我初始化静态地图,并设置参照Collections.unmodifiableMap(图M)。 我是否需要同步读取?

private static final Map<String,String> staticMap; static{ Map<String,String> tempMap = new HashMap<String,String>(); tempMap.put("key 1","value 1"); tempMap.put("key 2","value 2"); tempMap.put("key 3","value 3"); staticMap = Collections.unmodifiableMap(tempMap); }

--------------解决方案-------------

不,读不修改地图,所以我不会担心它。 这仅仅是写+写或写+读取需要围绕它同步。

不,你创建地图有有效的不可变的(因为没有具有对可变底层映射的引用)和安全的并发访问。 如果你想要更清晰的保证与使它更容易创建地图一起,番石榴的ImmutableMap型是专为只是这种使用(除其他事项外):

private static final ImmutableMap<String, String> staticMap = ImmutableMap.of(
"key1", "value1",
"key2", "value2",
"key3", "value3");

简短的回答是:没有。 你并不需要锁定,如果没有读写争。 您只有在无论你共享可能会改变,如果不改变那么它基本上是不可变的,immutables被认为是线程安全的锁。

这取决于Map实现。 HashMap中,TreeMap和等等都具有读取都是免费修改等都是精品,但跟踪使用情况实现可以在内部进行更新。

一个例子是与访问排序LinkedHashMap中:

new LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

这实际上将重新排序的元素在每次读取的键,值或条目,该迭代将在上次访问首份订单。 另一种可能会修改地图WeakHashMap

一个很好的替代\将是ImmutableMap在谷歌的番石榴库中找到。

我想,别人已经涵盖了答案已经(是HashMap中执行的情况下)。 如果你并不一定总是需要地图创建,你可以使用初始化点播持有人的成语让懒惰:

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class YourClass {

// created only if needed, thread-safety still preserved
private static final class MapHolder {
private static final Map<String,String> staticMap;
static{
System.out.println("Constructing staticMap");
Map<String,String> tempMap = new HashMap<String,String>();

tempMap.put("key 1","value 1");
tempMap.put("key 2","value 2");
tempMap.put("key 3","value 3");

staticMap = Collections.unmodifiableMap(tempMap);
}
}

// use this to actually access the instance
public static Map<String,String> mapGetter() {
return MapHolder.staticMap;
}

public static void main(String[] arg) {
System.out.println("Started, note that staticMap not yet created until...");
Map<String,String> m = mapGetter();
System.out.println("we get it: " + m);
}
}

这将打印:

Started, note that staticMap not yet created until...
Constructing staticMap
we get it: {key 1=value 1, key 2=value 2, key 3=value 3}

我不同意上面的答案。 包含在地图实现是非易失性字段(如HashMap.entrySet在不可修改的情况下: UnmodifiableMap.keySetUnmodifiableMap.entrySetUnmodifiableMap.values ​​)。 这些字段延迟初始化,静态初始化经过这么NULL。 如果一个线程调用随后entrySet()这个初始化领域的entrySet。 访问此字段是从所有其他线程不安全的。 本场可从另一个线程处于不一致的状态可以看出,或根本没有。

分类:java的 时间:2015-03-15 人气:0
本文关键词: Java中,并发
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.937 (s). 10 q(s)