多线程通讯中,发线,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;
}