网站ftp空间做旅游网站目的和意义
网站ftp空间,做旅游网站目的和意义,wordpress蜘蛛记录插件,网站租房做公寓HashMap头插死循环是指在JDK1.7中#xff0c;多线程环境下#xff0c;HashMap进行扩容时由于多个线程一起执行扩容#xff0c;可能会导致某一结点被错误插入头部并形成一个循环链表。 发生死循环的源码如下#xff1a;
// hashmap由数组链表构成
void transfer(Entry[] ne…HashMap头插死循环是指在JDK1.7中多线程环境下HashMap进行扩容时由于多个线程一起执行扩容可能会导致某一结点被错误插入头部并形成一个循环链表。 发生死循环的源码如下
// hashmap由数组链表构成
void transfer(Entry[] newTable) {Entry[] src table;int newCapacity newTable.length;// 遍历老的数组元素移动到新数组里for (int j 0; j src.length; j) {EntryK,V e src[j]; // 老数组元素一个链表if (e ! null) {src[j] null; // 删除旧链表do {// 重点看这里的几行代码采用的是头插法EntryK,V next e.next;// 找到新链表对应数组下标int i indexFor(e.hash, newCapacity); e.next newTable[i];newTable[i] e;e next;} while (e ! null);}}
} HashMap由数组链表构成假设容量为2扩容因子0.75 现在有两个线程T1和T2还要put元素5和7刚好hash冲突都放在了下标1的位置在线程T1和T2把要put的元素都被放进链表后通过链表解决哈希冲突它们发现超过了扩容因子所以两个线程开始执行扩容 此时T1、T2都指着同一个位置都是e指针指着7next指针指着5注意这里是不带头结点的链表所以每个结点都存数据e就是head旧链表 因为内存不够它们都意识到要对hashmap进行扩容扩容到40~3新链表 假设T1得到时间片先完成了扩容然后通过新的hash函数变到了新位置这里刚好还是1然后用不带头结点的头插法把原来位置的元素挪过来因为头插法所以顺序变反了735变成357但T2还是e指针指着7next指针指着5下图是T2的e 在轮到T2扩容的时候e.nextnewTable[i], newTable[i] e; e next; 就形成了一个循环链表。 虽然JDK1.8改成尾插法了不会死循环但是因为put和get都没加同步锁仍是线程不安全的
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92037.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!