2)线程一被调度回来执行。

  ● 是执行 newTalbe[i] = e;

  ● 然后是e = next,导致了e指向了key(7),

  ● 而下一次循环的next = e.next导致了next指向了key(3)

  3)一切安好。

  线程一接着工作。把key(7)摘下来,放到newTable[i]的第一个,然后把e和next往下移。

  4)环形链接出现。

  e.next = newTable[i] 导致  key(3).next 指向了 key(7)

  注意:此时的key(7).next 已经指向了key(3), 环形链表这样出现了。

  于是,当我们的线程一调用到,HashTable.get(11)时,悲剧出现了——Infinite Loop。

  其它

  有人把这个问题报给了Sun,不过Sun不认为这个是一个问题。因为HashMap本来不支持并发。要并发用ConcurrentHashmap

  我在这里把这个事情记录下来,只是为了让大家了解并体会一下并发环境下的危险。

  原文链接:http://coolshell.cn/articles/9606.html