分享个教训,因为这个小错误,我付出了三天时间来找原因,最后发现时,才如梦方醒:
上下文:用多个线程从一个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方法,这条教训我记得在《设计模式之禅》里作者强调过,唉~~自己体会到了!死了多少脑细胞才记住一条教训啊!
分享到:
相关推荐
4. 避免在多线程环境中直接使用HashMap:如果你确定不需要在多线程环境下共享HashMap,那么可以考虑局部变量的方式,只在单个线程中使用HashMap,这样就无需担心线程安全问题。 总结起来,理解HashMap的线程不安全...
在Java的HashMap中,多线程并发环境下的扩容操作可能会引发死锁问题。这主要发生在JDK 1.7版本,因为其扩容机制采用了头插法。以下详细解释这个问题及其解决方案。 首先,HashMap的扩容机制是在容量达到阈值时触发...
3. **复制HashMap**:在多线程操作HashMap前,先复制一份副本,然后在线程内部操作副本,操作完毕后再更新原始HashMap。这样可以避免直接操作原HashMap导致的并发问题,但这种方法会增加内存开销。 4. **使用...
线程安全是指在多线程环境中,一个类或方法可以被多个线程同时访问而不会导致数据不一致或者意外的结果。`HashMap`在设计时并未考虑线程安全,因此在并发场景下,如果不采取适当的同步措施,可能会遇到诸如数据丢失...
本文档深入探讨了`HashMap`在多线程环境中可能遇到的安全问题,并提出了一系列可行的解决方案。 #### 二、HashMap线程安全问题分析 在多线程环境中,`HashMap`的主要线程安全问题包括但不限于: 1. **链表死循环...
在这个主题中,我们将深入探讨如何使用JNI处理HashMap、String等对象。 首先,让我们来理解JNI的基本结构。JNI接口提供了大量的函数,让本地方法(C/C++代码)能够创建、访问和修改Java对象。要使用JNI,你需要定义...
然而,`HashMap`并非线程安全,这意味着在多线程环境中直接使用`HashMap`可能会导致数据不一致、并发问题,甚至程序崩溃。本项目“hashmap-thread-test”显然是为了测试和展示这一特性。 ### Java HashMap 的特性 ...
答:在多线程环境下,可以使用ConcurrentHashMap,它是线程安全的HashMap实现。 五、HashMap与HashSet的关系 HashSet基于HashMap实现,每个元素作为HashMap的一个键,值为null。因此,HashSet的操作性能也依赖于...
在HashMap中,键和值可以是任何类型的对象,只要它们实现了equals()和hashCode()方法,这两个方法用于确定对象的哈希值以及比较两个对象是否相等。 HashMap的存储机制基于以下几个关键点: 1. **哈希函数**:...
而在多线程环境中,特别是对线程安全有严格要求的场景下,`HashTable`则是更好的选择。此外,随着Java并发库的发展,现在更推荐使用`ConcurrentHashMap`,因为它不仅提供了线程安全的功能,而且在性能上比`HashTable...
本文将探讨如何利用JavaScript和Java中的HashMap(在JavaScript中,我们可以使用类似的数据结构,如`Map`)来消除`<select>`中的重复值。 首先,让我们了解HashMap或Map数据结构。HashMap是Java中的一种集合类,它...
HashSet中的元素没有顺序,添加元素时,HashSet会将元素转化为键放入HashMap中。因此,HashSet的插入和查找速度与HashMap相当,但由于HashSet不需要存储值,所以它的空间效率略高于HashMap。 在使用HashMap时,需要...
在给定的代码片段中,并没有直接涉及到多线程的创建与使用,但是我们可以基于这段代码来讨论如何在类似场景下引入多线程。 ### 使用Swing构建图形用户界面 给定的代码展示了如何使用Java Swing库来构建一个简单的...
其二,在上面的例子中,其实是声明了一个继承自 HashMap 的子类,然而有些串行化方法,例如要通过 Gson 串行化为 json,或者要串行化为 xml 时,类库中提供的方式,是无法串行化 HashSet 或者 HashMap 的子类的,也...
因此,在多线程环境中使用`HashMap`时,如果不采取额外的同步措施,可能会导致数据不一致或其他并发问题。 #### 2. 同步机制 - **Hashtable**: 使用内部同步机制来确保线程安全,这意味着在执行关键操作时会锁定...
2. 键不能重复:如果尝试将重复的键添加到 HashMap 中,后添加的键将覆盖之前的键,最后一次添加的键的值将被保留。 3. 键可以是对象类型:HashMap 中的键可以是对象类型的,可以是基本类型,也可以是引用类型。 值...
5. **线程不安全**:HashMap不是线程安全的,如果在多线程环境中使用,需要外部同步机制,或者使用ConcurrentHashMap。 6. **null键与null值**:HashMap允许键和值为null,但只有一个键可以为null,且该键对应的值...
在多线程环境下,若需保证线程安全,可以考虑使用 ConcurrentHashMap 替换 HashMap。而在列表操作中,根据插入位置和访问顺序,可以选择 ArrayList 或 LinkedList。了解这些基本数据结构的特点和用法,有助于我们在...
为了避免这种情况,开发者需要在多线程环境下使用线程安全的数据结构,如ConcurrentHashMap,或者在单线程环境中确保put操作的原子性。 总的来说,马士兵老师的HashMap学习笔记不仅涵盖了HashMap的基础知识,还深入...