各位前辈,小弟现在碰到这么一个java问题
我在 servelt 里面用 HashMap 存入一条消息,这条消息再通过Socket发到另一台设备上面,现在有两种情况:
1.设备有响应:我就可以通过返回的响应,解析出来key,再将HashMap把对应的消息删除掉.
2.设备没有响应:我是通过一个定时器去处理这些放在 HashMap 里面超时的消息(比如30秒).这时候因为考虑到多线程并发问题,所以这个HashMap做同步的遍历,因为没有设备没有返回,我也无法获得 key ,所以只有去遍历全部 HashMap 里的消息,再去判断是否有超时的消息在里面。
现在就有两个关键性问题: 在大容量并发的时候,如果我的定时器开始执行并且同步HashMap,将导致前面的请求堵塞,而且因为都是超时的消息,我没有办法得到 key , 只有去全部查询一边。性能大大降低
请问各位指点一下处理的办法或者思路,小弟万分感激啊!!!在线等

解决方案 »

  1.   

    1.定义同步map:map  temp=collections.synchronizedMap(new hashmap());2.使用同步方法:
    public synchronized void xxx()
    {
      ……
    }
    3.在map使用时加锁:lock(map){……}
      

  2.   

    恩,我是使用了同步,是手动添加的... 但是当定时器遍历超时消息,这个是同步。但前面请求servlet都被堵塞在 HashMap 上面了。    因为是大容量测试,定时器启动后,servlet就没办法接受请求,而且这个时候必须全Map查询,效率大大降低啊
      

  3.   

    如果在定时的时候锁住HashMap,我前面的Servelt就无法处理前面的请求,都堵在这里了....
    而且我在处理超时消息的时候,我没有办法得到key,要整个Map遍历,这时间伤不起啊!!!!