首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

Map不同步的有关问题

2012-03-29 
Map不同步的问题Java codepublic static MapString, MapString, String a_set Collections.synchron

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的同步包装对象作为锁,在同步方法里面迭代集合


热点排行