我对HashMap有一个奇怪的问题.
有多个线程访问相同的hashmap(不是线程安全).
有时候,这个过程会被卡住.
当我检查线程堆栈时,我看到许多线程处于状态:
java.lang.Thread.State: RUNNABLE
at java.util.HashMap.get(HashMap.java:303)
Run Code Online (Sandbox Code Playgroud)
注意这种情况非常罕见.并且无法按需复制.
为什么会卡住?
hashmap上没有同步.
键是字符串
我使用的LinkedBlockingQueue是多个线程填充,项目数量很大(数千万个对象).
LinkedBlockingQueue.take()花费大量时间(通过分析器检查) - 56%的时间.
队列永远不会空!
什么会影响take()方法的性能?
更新:我在处理take()结果的代码中做了一些更改,我还将take()放到另一个线程中,性能几乎提高了50%.
我不明白这是怎么可能的,因为我没有改变推杆的任何逻辑......
更新:
我在调用take()之前计算了队列已满的次数:
使用原始代码,90%的调用队列已满.
通过改进的代码,13%的呼叫队列已满.