同時HashMapの下に解決無限ループ問題

まず、ジュニアパートナーが明確でなければならない:無限ループの問題は、JDK 1.8の前に存在する、JDK 1.8はloHeadとloTailを追加することで修正されました。

JDK 1.7およびサーバーのCPUで同時実行性で、以前のHashMap原因循環の問題では、スレッドセーフ高い同時実行の場合は、無限ループを引き起こすことがあるかのHashMapについて今日を解決するために、その後、100%に急騰しました。

死のサイクルを探求するHashMapの理由は、まず根本的に理解するために、ハッシュマップのハッシュマップのソースコードを知っている必要があります。

要素が閾値数に達した最初の挿入要素をハッシュマップ。

まず、ジュニアパートナーが明確でなければならない:無限ループの問題は、JDK 1.8の前に存在する、JDK 1.8はloHeadとloTailを追加することで修正されました。

JDK 1.7およびサーバーのCPUで同時実行性で、以前のHashMap原因循環の問題では、スレッドセーフ高い同時実行の場合は、無限ループを引き起こすことがあるかのHashMapについて今日を解決するために、その後、100%に急騰しました。

死のサイクルを探求するHashMapの理由は、まず根本的に理解するために、ハッシュマップのハッシュマップのソースコードを知っている必要があります。

要素が閾値数に達した最初の挿入要素をハッシュマップ。

addEntryは、バレルを判定するための閾値に達していないしきい値に達すると、メソッドのサイズを変更して行くでしょう。

要素を転送するための着信転送方法でメソッドのサイズを変更:

以下の方法は、死の方法サイクルは、11年の私に聞いてください、登場しています。

拡張のためのハッシュマップは、順番に、古いハッシュマップの転送転送の要素を求め、その後、我々は今日の無限ループの問題を探求する必要がある場合、reaize方法を行って、このハッシュマップの拡張後のしきい値を達成するために要素を追加することで何が起こったかであります方法ここで、コードの次の4つの行の転送要素メソッド呼び出しの転送中:

    Entry<k,v> next = e.next;
    e.next = newTable[i];
    newTable[i] = e;
    e = next;

コードの4行は、次のチャート要素(スレッドの場合には競合しない)の転送を疑問視していないようだという、新たな、ラフな表情に挿入されたHashMapの要素:

だから、マルチスレッド時に(A、Bのスレッド)を同時に我々のコードにアクセスします。

スレッドは現在、次のコードを実行するための時間です。

    Entry<k,v> next = e.next;

逆ネジタイムスライス、今回転送完了伝達要素を引き継ぐために、スレッドB、及び今回スレッドシートを取得し、コードを実行する時間:

 

eは時間=ときに示すように、コードを実行した後、この時間は、この時間を実行します。

e.next = newTable[i];// a元素指向了b元素 产生循环

それは一度に循環リストは要素を取得作り出すので、スレッドが舞い上がるCPUで、その結果、リングトラバーサルに飛び出すことができませんでした!

概要:複数のスレッドの場合、HashMapを使用しないようにしよう、あなたの代わりにのConcurrentHashMapを使用することができます。

マイクロチャンネル公衆番号に注意してください図書インタビューの経験と学習教材の数が多い:** AVAJ **

「プラン」への返信取得します

** 365 **プレーンメーカーのJavaによって、あなたは私をここに持っていたいです

おすすめ

転載: www.cnblogs.com/DoubleP/p/11450408.html