日期:2014-05-20  浏览次数:20944 次

Map不同步的问题
Java code

public static Map<String, Map<String, String>> a_set = Collections.synchronizedMap(new Hashtable<String, Map<String, String>>());


这个Map我有两个线程在用,一个用于写入操作,另一个用于读取并且会remove里面的value

这样就会导致不同步的问题,我在javaAPI里面看了,java提供了同步的Map实现HashTable,但是还是报java.util.ConcurrentModificationException 
后来我把Map用集合锁修饰下让它实现同步但是还是会报同样的异常

请问大侠们这是什么原因,小弟对线程同步方面了解的不是很多望指教

------解决方案--------------------
顶贴 对map了解的少 继续关注!
------解决方案--------------------
“读取并且会remove里面的value”

虽然你那样做后每个方法是同步的,但你需要的这个操作存在race condition,check-then-act和read-modify-wite并不是原子的,这就需要使用client locking来确保其原子性

另:报ConcurrentModificationException 应该是你在迭代map,使用ConcurrntHashMap可以解决这个问题,但上面的原子性问题依旧

我不知道你的“读取并且会remove里面的value”究竟是什么样的逻辑,按我的理解给出以上建议
------解决方案--------------------
下面是API上提供的方法
  
Map m = Collections.synchronizedMap(new HashMap());
...
Set s = m.keySet(); // Needn't be in synchronized block
...
synchronized(m) { // Synchronizing on m, not s!
Iterator i = s.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
 不遵从此建议将导致无法确定的行为。 

上面提示了要用Map的同步包装对象作为锁,在同步方法里面迭代集合