欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

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

更新时间: 2014-01-05 01:58:27 责任编辑: Author_N1

 

多线程并发中的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;
 }
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 01:58:27
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/3904/
本文WWW.DOC100.NET DOC100.NET版权所有。