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

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

2013-04-09 
多线程并发中的ConcurrentHashMap绝对线程安全问题多线程通讯中,发线,ConcurrentHashMap不是绝对线程安全

多线程并发中的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;
 }

热点排行