<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

     大家不用關(guān)心程序?qū)嶋H邏輯是否正確,只是好奇,為什么這個程序會hang住不運(yùn)行了?而且CPU會占用100%

    import java.util.HashMap;

    public class TestLock {

    private HashMap map = new HashMap();

    public TestLock() {
    Thread t1 
    = new Thread() {
    public void run() {
    for(int i=0; i<50000; i++) {
    map.put(
    new Integer(i), i);
    }
    System.out.println(
    "t1 over");
    }
    };

    Thread t2 
    = new Thread() {
    public void run() {
    for(int i=0; i<50000; i++) {
    map.put(
    new Integer(i), i);
    }

    System.out.println(
    "t2 over");
    }
    };


    t1.start();
    t2.start();

    }


    public static void main(String[] args) {    
    new TestLock();
    }
    }


    Dump thread會看到,程序hang到:

    "Thread-1" prio=6 tid=0x00c70bd8 nid=0x914 runnable [0x02ebf000..0x02ebfc68]
    at java.util.HashMap.put(HashMap.java:420)
    at TestLock$2.run(TestLock.java:20)

    "Thread-0" prio=6 tid=0x00c70a50 nid=0x578 runnable [0x02e7f000..0x02e7fb68]
    at java.util.HashMap.put(HashMap.java:420)
    at TestLock$1.run(TestLock.java:11)

    Feedback

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-04 17:53 by nobody
    HashMap 不是線程安全的;請換成Hashtable。

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-04 18:23 by Scud(飛云小俠)
    我在本地運(yùn)行了一下 沒發(fā)現(xiàn)死鎖.

    你可以用visualvm 檢測一下, 它可以發(fā)現(xiàn)是否死鎖, 已經(jīng)死鎖的行數(shù)等信息

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-04 20:07 by stone2083
    "Thread-1" prio=6 tid=0x00c70bd8 nid=0x914 runnable
    兩個線程都是runnable狀態(tài).

    這程序,理論上,不應(yīng)該出現(xiàn)死鎖的.

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?[未登錄]  回復(fù)  更多評論   

    2010-08-04 20:39 by 行云流水
    不會發(fā)生死鎖。不是線程安全的hashmap,貌似你也沒有用到鎖的概念。只是到最后map里面的數(shù)據(jù)大于50000.

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-04 21:02 by 天快黑了
    @nobody
    這個知道,現(xiàn)在是想搞明白程序?yàn)槭裁磿ang在那不走了

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-04 21:03 by 天快黑了
    @Scud(飛云小俠)
    應(yīng)該是與機(jī)器有關(guān),我公司機(jī)器,使用300個循環(huán)就會hang,你可以試著把循環(huán)調(diào)大一點(diǎn)試試看。

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-04 21:30 by stone2083
    突然記起來了.請參考這篇文章:
    http://sdh5724.javaeye.com/blog/619130

    在自己電腦上,一直無法重現(xiàn)這個問題(無論加大循環(huán),或者增加線程數(shù)),明天回公司再去看看.

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-04 22:02 by 天快黑了
    @stone2083
    非常感謝提供的鏈接。

    對,可能是多個線程同時修改HashMap,導(dǎo)致,HashMap內(nèi)部死循環(huán)了。不過奇怪,不管怎么dump thread,都是hang在HashMap.java:420,而查看HashMap的代碼,怎么也想不通這個地方會hang住。

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-05 09:37 by peacess
    線程還在運(yùn)行,而main函數(shù)已經(jīng)退了,

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-05 10:50 by 豬兒笨笨
    你在put方法420行的循環(huán)中 加一句
    System.out.println(e+" "+e.next);

    就會產(chǎn)生一個死循環(huán),即e=e.next.next。
    應(yīng)該是多線程下,進(jìn)行hash處理的時候出現(xiàn)的。

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-05 12:31 by 天快黑了
    @豬兒笨笨
    e.next訪問的是e的一個屬性,怎么會相當(dāng)于e.next.next?

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-05 19:06 by bigwesthorse
    我改成了concurrenthashmap還是會出現(xiàn),只是出現(xiàn)的頻率降低了不少,大家可以陸續(xù)開上千個進(jìn)程試一下
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    start javaw TestLock
    ...........etc

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-05 19:13 by bigwesthorse
    @bigwesthorse
    只有hashtable可以順利地通過1429個進(jìn)程測試,哈哈,似乎看到了一點(diǎn)讓人驚喜的東西

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?[未登錄]  回復(fù)  更多評論   

    2010-08-05 20:58 by kafka0102
    死循環(huán)的代碼在hashmap的transfer方法:
    void transfer(final Entry[] newTable) {
    final Entry[] src = table;
    final int newCapacity = newTable.length;
    final long time1 = System.currentTimeMillis();
    for (int j = 0; j < src.length; j++) {
    Entry<K,V> e = src[j];
    if (e != null) {
    src[j] = null;
    do {
    final Entry<K,V> next = e.next;
    final int i = indexFor(e.hash, newCapacity);
    e.next = newTable[i];
    newTable[i] = e;
    e = next;
    } while (e != null);
    }
    }
    }
    我的分析是:死循環(huán)就在while中,對同一個舊table中的e,一個線程執(zhí)行了 e.next = newTable[i];(還沒到 e = next;),另一個才到 final Entry<K,V> next = e.next;,結(jié)果后到的線程接著執(zhí)行e = next;造成e=e.next,死循環(huán)了。

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-05 22:00 by 豬兒笨笨
    樓上的
    不是e=e.next
    而是e=e.next.next
    不過你的分析應(yīng)該是對的,就是在根據(jù)hashcode計(jì)算位置的時候,因?yàn)椴l(fā)的原因出現(xiàn)問題了。

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-05 22:01 by 豬兒笨笨
    @天快黑了

    這個很正常的,因?yàn)閑.next相當(dāng)于一個鏈表指針,指向下一個點(diǎn),它們是同一個例的實(shí)類。

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-05 22:03 by 豬兒笨笨
    另外,關(guān)于HashMap的實(shí)現(xiàn),已經(jīng)說了是線程不安全的,多線程下,出現(xiàn)問題是正常的。

    Hashtable一直線程安全,可以放心用。
    但說concurrenthashmap不對,這個應(yīng)該不會。
    回頭也試一下再來討論。

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-05 22:38 by 豬兒笨笨
    用了concurrenthashmap,循環(huán)5000次,沒有出現(xiàn)問題。

    public TestLock() {


    for (int i = 0; i < 5000; i++) {

    final int count=i;

    Thread t1 = new Thread() {
    public void run() {
    for (int i = 0; i < 50000; i++) {
    map.put(new Integer(i), i);

    }
    System.out.println(count+" over");
    }
    };

    t1.start();
    }
    }

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-06 09:27 by bigwesthorse
    @豬兒笨笨
    對于concurrenthashmap
    用一個批處理寫1000多個start javaw TestLock
    肯定會出現(xiàn)的,我說了概率很低,基本上兩三百個程序會有個卡死
    你就等著那個批處理狂跑就行了,1到2分鐘之后,你就會感到cpu100%了
    被某個進(jìn)程霸占了,一直hang在那里

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-06 15:36 by 豬兒笨笨
    沒有明白樓上說什么意思?
    這樣說吧,是否在一個JVM內(nèi),還是說同時啟動多個JVM?
    如果多個JVM,就很難說有什么問題,比如說用光了資源,等等。

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-06 16:16 by bigwesthorse
    @豬兒笨笨
    就是這個程序是否出現(xiàn)死鎖要看rp的,跑個200多次才會出現(xiàn)一次
    我用批處理連續(xù)跑了上千次,出現(xiàn)了好幾次死鎖的情況

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?  回復(fù)  更多評論   

    2010-08-07 10:51 by 天快黑了
    感謝大家的回復(fù),這個問題確實(shí)很難解釋清楚。我們只能注意,多線程下千萬不要使用非線程安全的對象。

    # re: 誰能幫忙解釋一下為什么這個程序會死鎖?[未登錄]  回復(fù)  更多評論   

    2010-10-20 16:59 by littleJava
    @豬兒笨笨
    ConcurrentHashMap只是保證Happens-before關(guān)系,勉強(qiáng)的線程安全,如果需要保證數(shù)據(jù)一致性,還是用Collections.synchronizedMap(Map map)方法,利用的synchronized機(jī)制,規(guī)劃好代碼流程來實(shí)現(xiàn)線程安全

    posts - 5, comments - 25, trackbacks - 0, articles - 1

    Copyright © 天快黑了

    主站蜘蛛池模板: 亚洲国产精品自在在线观看| a级成人毛片免费图片| 亚洲第一福利视频| 亚洲国产精品激情在线观看| 亚洲人成网站免费播放| 久久免费动漫品精老司机| 国产成人无码免费网站| 国产精品亚洲一区二区三区在线观看 | 亚洲av专区无码观看精品天堂| 中文字幕中韩乱码亚洲大片| 国产禁女女网站免费看| 日本一区二区三区免费高清| 日本人的色道免费网站| 免费人成视频在线观看网站| 爱丫爱丫影院在线观看免费| 久久毛片免费看一区二区三区| 真正全免费视频a毛片| 亚洲第一街区偷拍街拍| 中文字幕精品三区无码亚洲| 亚洲一区二区三区高清视频| 亚洲理论片中文字幕电影| 久久精品国产亚洲精品2020| 久久精品国产亚洲AV网站| 久久综合图区亚洲综合图区| 国产成人A人亚洲精品无码| 亚洲精品无码鲁网中文电影| 国产亚洲视频在线播放| 亚洲人成伊人成综合网久久久| 国产亚洲?V无码?V男人的天堂 | 亚洲深深色噜噜狠狠网站| 日韩亚洲AV无码一区二区不卡| 亚洲AV中文无码字幕色三| 亚洲国产精品va在线播放| 亚洲国产成人片在线观看无码 | 日韩免费电影网站| 毛片在线全部免费观看| 香蕉成人免费看片视频app下载| 午夜不卡久久精品无码免费| 免费人成视频在线观看网站| 免费国产黄网站在线观看可以下载| 91免费福利精品国产|