分享个教训,因为这个小错误,我付出了三天时间来找原因,最后发现时,才如梦方醒:
上下文:用多个线程从一个ConurrentLinkedQueue里读文件名字,解析出文件名里的日期,然后把名字和日期放到另一个ConurrentLinkedQueue里,线程是这样写的:
HashMap nameDateMap = new HashMap(2);
try{
while(true)
{
if(!this.isRunning)
{
this.wait();
wakeup = System.currentTimeMillis();
}
else
{
logger.debug("Processing file : " + fileName );
dataSetID = determineType(fileName);
if(dataSetID.length() > 0)
{
nameDateMap.put("fileName", fileName);
nameDateMap.put("fileDate", parseTime(fileName));
idQueueMap.get(dataSetID).add(nameDateMap); //将文件放入该类型对应的待解码队列
}
this.setRunning(false);
}
}
}catch(InterruptedException ie)
{
logger.debug("Determine thread is interrupted: " + ie.getMessage());
}
接收者总是提示接收到了重复的名字,但是我这里logger语句明明没看到哪个文件名被重复发送了,纠结得很。最后,聪明的同事说,HashMap对象是在while循环外面声明的(第一行代码那里),但是在循环里面这个HashMap对象反复了put了key相同的两个键值对,问题可能就出在这里。于是,把第一行语句移到else里面去,接受者再也没有提示重复了,而之前看不到重复发送的迹象,是因为打印的是文件名,而不是打印的HashMap里的值。 当然,放值前调用HashMap的clear方法比重新创建对象要好。一个教训,又上了一课。如果你想对HashMap等Java集合类对象重复使用时,千万记得在重复装载值之前调用clear方法,这条教训我记得在《设计模式之禅》里作者强调过,唉~~自己体会到了!死了多少脑细胞才记住一条教训啊!
分享到:
相关推荐
HashMap为什么是线程不安全的?如何解决HashMap的线程不安全问题?
高级程序员必会的HashMap的线程安全问题,适用于0~2年的
比如,当前集合数组长度为2,已经有两个元素被放在了下标为0的节点里形成了链表结构,此时,有两个线程都同时向集合添加新元素,所以每个线程在添加时都会对原集合数组进行扩容。 插入前的数组 : 1)线程一先执行...
HashMap源码分析系列-第四弹:HashMap多线程解决方案.docx
包含各种对象转换成json对象,还包含把对象中的属性转成hashmap 并且可以过滤为空的或者为null的对象
JNI处理hashmap,string等对象的操作,别处绝对没有的
多线程环境下,建议使用 ConcurrentHashMap,或者使用 Collections.synchronizedMap(hashMap) 将 HashMap 转成线程同步的。 只能使用关联的键来获取值。 HashMap 只能存储对象,所以基本数据类型应该使用其包装器...
非线程安全:如果多个线程同时访问同一个HashMap实例,可能会导致数据不一致的问题。因此,在使用HashMap时需要进行同步处理或者使用线程安全的HashMap实现类。 动态扩容:当HashMap中的元素数量超过了容量(默认为...
HashMap在多线程的环境下是不安全的,没有进行加锁措施,所以执行效率快。如果我么需要有一个线程安全的HashMap,可以使用Collections.synchronizedMap(Map m)方法获得线程安全的HashMap,也可以使用...
Java面试全方位复习攻略,详解集合框架,hashmap底层原理,多线程,消息队列,radis,spring-boot ,Spring-cloud技术,等等
Monitor是JVM实现的对象,当使用synchronized(obj)对一个对象进行加锁的时候,那么这个对象头中的MarkWord中就保存了一份对JVM中Monitor对象的引用。 Monitor中有EntrySet、Owner,Owner是Monitor的所有者(当前获得...
主要介绍了java在hashmap初始化时赋初值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
javaScript模拟的HashMap数据结构,可以方便的put和get。几乎和Java中HashMap类的功能一模一样。非常好用的!
02 Java 程序中的多线程 03 编写多线程的 Java 应用程序 04 如果我是国王:关于解决 Java编程语言线程问题的建议 (2) 05 构建Java并发模型框架 (2) 06 Java 技术: 使您轻松地进行多线程应用程序编程 07 使用...
Java标准库中的一些类如ArrayList、HashMap和SimpleDateFormat,都是非线程安全的,在多线程环境下直接使用它们可能导致一些非预期的结果,甚至是一些灾难性的结果。一般来说,Java标准库中的类在其API文档中会说明...
HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别。...因此,在多线程环境下,HashTable比HashMap更安全,但是性能可能较差。此外,HashMap允许将null作为键和值使用,而HashTable不允许。
模拟java中的HashMap类js类对象,可以与js的Array类对象配合使用
哈希映射线程测试使用 Maven 构建和运行 mvn exec:java
如何得到hashmap的索引,很好用,正在为hashmap烦恼的人看一下这个
java面试题及答案(基础题122道,代码题19道) 内容比较全,有助与去应聘java类职位的人