可信赖的邵阳网站建设,德清做网站,什邡门户网站,常用的网络营销策略有哪些JDK7多线程并发环境HashMap死循环infinite loop#xff0c;CPU拉满100%#xff0c;Java HashMap底层数据实现是数组链表#xff0c;链表在哈希碰撞后装入新数据#xff0c;像是一个桶。 HashMap在JDK7的实现中#xff0c;并发环境存在死循环infinite loop问题。导致的结果…JDK7多线程并发环境HashMap死循环infinite loopCPU拉满100%Java HashMap底层数据实现是数组链表链表在哈希碰撞后装入新数据像是一个桶。 HashMap在JDK7的实现中并发环境存在死循环infinite loop问题。导致的结果之一是程序在多线程并发环境下运行到某些时机CPU拉满100%杀掉进程启动后程序恢复正常但是再次启动多线程的并发环境下再跑到一定时机get操作后开始死循环又会把CPU拉满100%陷入死循环。
HashMap在并发的多线程环境下扩容造成死循环。通常在初始化HashMap时候会有一个loadFactore负载因子比如0.75当原先存储的元素size达到固有长度的0.75后开始扩容扩容过程用头插法把oldTable单链表的节点插入到newTable单链表newTable单链表倒置了oldTable中的单链表。 于是多线程并发扩容场景下很可能导致扩容后的HashMap产生一个有环的单链表进而导致后续get取数据陷入死循环CPU拉满100%。
新链表的顺序跟旧的链表是完全相反的只要保证建新链还是原来顺序就不会产生循环JDK8用 head 和 tail 来保证链表顺序和之前一样就不会产生循环引用。
结论JDK8中Java修正了该问题但HashMap始终存在线程安全问题比如并发put会发生数据覆盖所以避免在多线程并发环境用HashMap如果是并发多线程环境请
1、ConcurrentHashMap替代HashMap。
2、使用 synchronized 或 lock 加锁HashMap。效率低 LinkedHashMap实现LRU缓存cache机制Kotlin_zhangphil的博客-CSDN博客* * 基于Java LinkedList,实现Android大数据缓存策略 * 作者Zhang Phil * 原文出处http://blog.csdn.net/zhangphil * * 实现原理原理的模型认为在LinkedList的头部元素是最旧的缓存数据在L_android大数据缓存。一句话概括的说两者最大的不同就是HashMap不保证put进去的数据的顺序例如假如在HashMap中依次、顺序添加元素12345在遍历HashMap时输出的顺。https://blog.csdn.net/zhangphil/article/details/132604797Java的HashMap与LinkedHashMap异同_zhangphil的博客-CSDN博客一句话概括的说两者最大的不同就是HashMap不保证put进去的数据的顺序而LinkedHashMap则保证put进去的数据的顺序。换句话也就是说HashMap添加进去的数据顺序和遍历时的数据顺序不一定而LinkedHashMap则保证添加时数据顺序是什么遍历时数据顺序是什么。例如假如在HashMap中依次、顺序添加元素12345在遍历HashMap时输出的顺https://blog.csdn.net/zhangphil/article/details/44115629