https://juejin.im/post/5df8d7346fb9a015ff64eaf9
スレッドセーフでは問題を解決する方法を、マルチスレッド環境でのHashMapがあります
- 使用Collections.synchronizedMap(マップ)スレッドセーフマップのコレクションを作成します。
- ハッシュ表
- ConcurrentHashMapの
ハッシュ表:
HashMapのハッシュテーブルと比較して、マルチスレッドの場合に使用するのに適したスレッドセーフであるが、効率はあまり楽観的であることができます。
彼は、データ操作の時にロックされますので、効率が比較的低いです。
HashMapの違いとハッシュテーブル:
ハッシュテーブルは、キーまたはnull値を許可されていない、キーのHashMapのはnullにすることができます
Hashtableの私たちが直接空売りのヌルポインタ例外を置くが、HashMapのは、特別な治療を行っているときので。
静的 最終 int型のハッシュ(オブジェクトキー){ int型、H。 リターン(キー== nullの)?0:(H = key.hashCode())^(H >>> 16 )。 }
使用してHashtableのフェイルセーフ機構(フェイルセーフ)は、このメカニズムは、読み取りデータは必ずしも最新のデータではない、あなたを行います。
あなたがnull値を使用する場合は、対応するキーが存在しないか、あなたは、もはやかつてのキーが同じ理由で存在しているかどうかのConcurrentHashMap、判断される(キー)を含めると呼ばれることができるため、空ではありませんしないかを決定することができなくなります。
-
異なる実装:Hashtableの辞書クラスを継承し、HashMapのはAbstractMapのクラスを継承しています。
辞書JDK 1.0が追加された一見誰もがこれを使用していない、私が使用していません。
-
異なる初期容量:初期のHashMapの容量:16、Hashtableの初期容量:0.75:11、デフォルトの負荷係数の両方です。
-
異なる膨張機構:空き容量が負荷率*、HashMapの二重電流容量拡張ルール、ハッシュテーブルダブル容量拡張ルール現在+ 1までの総容量よりも大きいです。
-
イテレータ異なる:イテレータでのHashMapのイテレータは、フェイルファストで、Hashtableの列挙子は、フェイルファストではありません。
他のスレッドのような、HashMapの構造を変更したときにそう:追加、削除要素のHashtableがない一方であり、ConcurrentModificationExceptionは、例外がスローされます。
イテレータの内容への直接アクセス横断中の変数modCountの収集および使用を横断。
コレクション中にコンテンツが変更された場合、それはmodCountの値を変更します横断されます。
横断要素は、次に、トラバースに戻されるexpectedmodCount modCount変数の値は、かどうかを検出する前に、次の反復がhashNext()/次()を使用するたびに、そうでない場合は例外をスローし、トラバースを終了します。
- あなたの理解についてHashtableの話は、getのプロセスについての話はどこに置きます。ConcurrentHashMapの同じ質問。
- 1.8最適化を何ですか?
- スレッドセーフに行うにはどのように?
- どのような問題は、安全でないにつながることができますか?
- どのように解決するには?どのスレッドセーフなコンカレント・コンテナーはありませんか?
- ConcurrentHashMapのは、どのように達成することですか?
- ConcurrentHashMapの同時実行、なぜそんなに良く?
- 1.7、1.8は何が違うのを達成するために?なぜこれを行いますか?
- CASは何ですか?
- ABAは何ですか?どのシーン、どのように解決するには?
- 同期基本原理は何ですか?
- 同期ロックのエスカレーション戦略
- 高速障害が(フェイルファスト)有効で、どのようなシナリオ?セキュリティの失敗(フェイルセーフ)同じ質問。
- ......