当前位置: 代码迷 >> 高性能WEB开发 >> 多线程并发中的ConcurrentHashMap绝对线程安全有关问题
  详细解决方案

多线程并发中的ConcurrentHashMap绝对线程安全有关问题

热度:840   发布时间:2013-04-09 16:45:09.0
多线程并发中的ConcurrentHashMap绝对线程安全问题
多线程通讯中,发线,ConcurrentHashMap不是绝对线程安全的,就是用CLASS销都不行。
public class ManageData {

public static ConcurrentHashMap<SocketAddress,Message> hm =new ConcurrentHashMap<SocketAddress, Message>();
private static byte[] lock= new byte[0];

public void addMessage(SocketAddress client, Message message){
synchronized(lock){
hm.put(client, message);
}
}

        public Message getMessageObject(SocketAddress address){
Message ret =null;
ret=hm.get(address);
if(null==ret){
ret=new Message();
synchronized(lock){
hm.put(address, ret);
}
}
return ret;
}



在调用getMessageObject()时老是出现前面的key已经放进去了。后面的会再放一次,覆盖了前面的对象。出错

------解决方案--------------------
    
有可能第一个线程调用addMessage中的同步块方法,但put还没有执行完,map.get(key)为空
第二个线程已经执行到判断hm.get(address);为null,等第一个线程释放对象锁后,就执行hm.put(address, ret);操作,
所以后面才会再放一次

  public Message getMessageObject(SocketAddress address){
synchronized(lock){
Message ret =null;
ret=hm.get(address);
if(null==ret){
ret=new Message();

hm.put(address, ret);
   
}
return ret;
 }
  相关解决方案