`

模拟HashMap死循环现象

阅读更多
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);
            }
        }
    }



目前已经找到挂起的代码点了,下次再分析挂起原因:)


分享到:
评论
1 楼 magicyang919 2014-11-13  
我测试的没出现cpu 100%的情况。测试了很多次都没有

相关推荐

Global site tag (gtag.js) - Google Analytics