PS:不得不说Java编程思想这本书是真心强大.. 学习内容: 1.HashMap<K,V>在多线程的情况下出现的死循环现象   当初学Java的时候只是知道HashMap<K,V>在并发的情况下使用的话,会出现线程安全问题,但是一直都没有进行深入的研究,也是最近实验室的徒弟在问起这个问题的原因之后,才开始进行了一个深入的研究.   那么这一章也就仅仅针对这个问题来说一下,至于如何使用HashMap这个东西,也就不进行介绍了.在面对这个问题之前,我们先看一下HashMap<K…
最近项目中出现了Tomcat占用CPU100%的情况,原以为是代码中出现死循环,后台使用jstack做了dump,发现是系统中不合理使用HashMap导致出现了死循环(注意不是死锁). 产生这个死循环的根源在于对一个未保护的共享变量 — 一个"HashMap"数据结构的操作.当在所有操作的方法上加了"synchronized"后,一切恢复了正常. 这算jvm的bug吗?应该说不是的,这个现象很早以前就报告出来了(详细见:http://bugs.sun.com/bug…
最近项目中出现了Tomcat占用CPU100%的情况,原以为是代码中出现死循环,后台使用jstack做了dump,发现是系统中不合理使用HashMap导致出现了死循环(注意不是死锁). 产生这个死循环的根源在于对一个未保护的共享变量 — 一个"HashMap"数据结构的操作.当在所有操作的方法上加了"synchronized"后,一切恢复了正常. 这算jvm的bug吗?应该说不是的,这个现象很早以前就报告出来了(详细见:http://bugs.sun.com/bug…
作者:炸鸡可乐 原文出处:www.pzblog.cn 一.问题描述 经常有些面试官会问,是否了解过 HashMap 在多线程环境下使用时可能会发生死循环,导致服务器 cpu 100% 的线上故障? 关于这个问题,很多年前,在淘宝内网里就有很多的程序员发过这种帖子说一个CPU 被100%了,原因竟是多线程环境下使用 HashMap 造成的死循环,并且这个事发生了很多次. 虽然 Java 官方明确表示,在多线程环境下不推荐使用 HashMap,但是对于这种问题,小编其实也比较意外,如果不是深入的去了…
这个问题是在面试时常问的几个问题,一般在问这个问题之前会问Hashmap和HashTable的区别?面试者一般会回答:hashtable是线程安全的,hashmap是线程不安全的. 那么面试官就会紧接着问道,为什么hashmap不是线程安全的,会造成什么问题么?于是面试者就回答:HashMap在并发情况下的put操作会造成死循环. 这时候就会被面试官问:HashMap在并发为什么造成死循环? 很多面试者这时候就会一脸懵.没有过相关经验和深入的理解源码是很难回答这个问题的. 下面我们就通过HahM…
1.多线程put操作后,get操作导致死循环. 2.多线程put非null元素后,get操作得到null值. 3.多线程put操作,导致元素丢失. 死循环场景重现 下面我用一段简单的DEMO模拟HashMap死循环: 1 public class Test extends Thread 2 { 3 static HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(2); 4 static AtomicInteg…
懒汉模式和饿汉模式: public class Demo { //private static Single single = new Single();//饿汉模式 private static Single single2 = null;//饿汉模式 public Demo() { if (single2 == null) {//1 single2 = new Single();//2 } } } 在多线程环境下,代码1和代码2之间,这里会有线程安全问题,线程A和线程B同时到代码1和代码2之…
转载自:https://blog.csdn.net/lzhcoder/article/details/79469123 https://blog.csdn.net/u013374645/article/details/91409150 1.最经典的缓存+数据库读写的模式,cache aside pattern 1.1.Cache Aside Pattern (1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应 (2)更新的时候,先删除缓存,然后再更新数据库…
Add时出错 错误信息: Index was outside the bounds of the array. 详细信息: at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at ****.GetEnumDescription(Enum value) at ****.Page_Load(Object sender, EventArgs e) at System.Web.Ut…
福哥答案2020-04-22: jdk1.8下的hashmap采用的是尾插法,不会有链表成环的问题.jdk1.7下采用的头插***有链表成环的问题. hashmap成环原因的代码出现在transfer代码中,也就是扩容之后的数据迁移部分 解释一下transfer的过程:首先获取新表的长度,之后遍历新表的每一个entry,然后每个ertry中的链表,以反转的形式,形成rehash之后的链表. 并发问题:若当前线程此时获得ertry节点,但是被线程中断无法继续执行,此时线程二进入transfer函数…