Map不同步的问题

你好毒你好毒 2011-12-28 01:46:59

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用集合锁修饰下让它实现同步但是还是会报同样的异常

请问大侠们这是什么原因,小弟对线程同步方面了解的不是很多望指教
...全文
144 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Call Next 2011-12-29
  • 打赏
  • 举报
回复
下面是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的同步包装对象作为锁,在同步方法里面迭代集合


你好毒你好毒 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangxvwang 的回复:]

下面是API上提供的方法

Map m = Collections.synchronizedMap(new HashMap());
...
Set s = m.keySet(); // Needn't be in synchronized block
...
synchronized(m) { // Synchronizing on m, no……
[/Quote]

你的这种建议讲导致我入库的数据会严重阻塞,因为1秒钟可能有几十条数据
你好毒你好毒 2011-12-29
  • 打赏
  • 举报
回复
一直没人回复,所以没关照自己的这个帖子,所以不好意思


我其实已经说的清楚了,就是一个静态的集合一遍进数据,另一边在读里面的数据做业务处理

试一下用二楼的ConcurrntHashMap
龙四 2011-12-28
  • 打赏
  • 举报
回复
“读取并且会remove里面的value”

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

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

我不知道你的“读取并且会remove里面的value”究竟是什么样的逻辑,按我的理解给出以上建议
Kings_jinchao 2011-12-28
  • 打赏
  • 举报
回复
顶贴 对map了解的少 继续关注!

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧