Java中有一个HashMap,我们也都知道,改类型为线程不安全,会出现线程死锁问题,今天我们通过一个小代码来模拟一下HashMap产生死锁,同时描述一下现象:
代码:
java代码:
package com.wmmad.threadlocal.test;
import java.util.HashMap;
/**
* @author madding.lip
*
* @date 2010.08.25
*
* <pre>模拟HashMap死锁现象</pre>
*/
public class HashMapLock {
private HashMap hash = new HashMap();
public HashMapLock() {
Thread t1 = new Thread() {
public void run() {
for (int i = 0; i < 50000; i++) {
hash.put(new Integer(i), i);
}
System.out.println("t1 over");
}
};
Thread t2 = new Thread() {
public void run() {
for (int i = 0; i < 50000; i++) {
hash.put(new Integer(i), i);
}
System.out.println("t2 over");
}
};
t1.start();
t2.start();
}
public static void main(String[] args) {
new HashMapLock();
}
}
shell代码:
#!/bin/bash
# author: madding.lip
# date: 2010.08.25
# function: mutli call
for i in `seq 1 1000`; do
java com/wmmad/threadlocal/test/HashMapLock
done
exit 0
用shell脚本去跑,无非是增加实例数。多次操作后,就能查找偶然性中的必然性
编译java代码,再运行shell脚本,大概在运行到50左右的时候就会挂起,这是使用jps命令查看一下进程发现会有如下java进程:
29369 Jps
27424
29355 HashMapLock
7745
15518
10268
用jconsole链接对应的进程,查看该进程暂用资源情况
现象:
1.cpu不断飙升,直到把所有cpu资源全部占满(最典型现象)
2.Heap内存由规律折回
3.Stack trace:
java.util.HashMap.transfer(HashMap.java:484)
java.util.HashMap.resize(HashMap.java:463)
java.util.HashMap.addEntry(HashMap.java:755)
java.util.HashMap.put(HashMap.java:385)
com.wmmad.threadlocal.test.HashMapLock$2.run(HashMapLock.java:24)
可以看到挂起的代码是这里:
void transfer(Entry[] newTable) {
Entry[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
Entry<K,V> e = src[j];
if (e != null) {
src[j] = null;
do {
Entry<K,V> next = e.next;
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
}
目前已经找到挂起的代码点了,下次再分析挂起原因:)
分享到:
相关推荐
HashMap死循环原因分析.docx
Java基础-模拟HashMap集合(基于数组和链表) 数组和链表.pdf
详 解 hashmap 1.7 扩 容 机 制 的 数 据 迁 移 以 及 出 现 环 形 列 表 导 致 死 锁 情 况 视 频
疫苗:Java HashMap的死循环
HASHMAP基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)下面小编来带大家详细了解下吧
1. 用HashMap模拟一个网上购物车。要求:从键盘输入5本书的名称、单价、购买数量,将这些信息存入一个HashMap,然后将该HashMap作为参数调用方法getSum(HashMap books),该方法用于计算书的总价并返回。【说明:...
javaScript模拟的HashMap数据结构,可以方便的put和get。几乎和Java中HashMap类的功能一模一样。非常好用的!
本篇文章是对Java HashMap的死循环进行了详细的分析介绍,需要的朋友参考下
hashmap实例 hashmap实例hashmap实例hashmap实例
HashMap介绍和使用
hashmap相关的面试题
HashMap数据结构,HashMap的构造方法,HashMap的put,HashMap的get
模拟java中的HashMap类js类对象,可以与js的Array类对象配合使用
java1.7 HashMap用的是数组+链表实现的,同时采用的头插入法,存在死循环的问题 java1.8 HashMap用的是数组+链表+红黑树实现的,采用尾插法实现的,解决了死循环的问题,今天分析的就是1.8 // 初始容量为16 ...
java7 hashmap源码 随着Java学习的不断深入,发现...多线程下,hashmap的resize()方法为什么容易出现死循环? 答: 其他面试题? 答: 并发 概述 :star::star: :star::star: 线程池 :star: AQS :star: 锁 ListenalbeFut
HashMap存放.doc
Hashmap详解
hashMap排序,hashmap使用还是比较频繁。这时自己写的一个实现hashmap排序的例子
HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改HashMap是非synchronized,所以HashMap很快...