ホームページ  >  記事  >  Java  >  Java のさまざまなコレクションのスレッド セーフについての深い理解

Java のさまざまなコレクションのスレッド セーフについての深い理解

青灯夜游
青灯夜游転載
2019-11-28 17:45:442096ブラウズ

Java のさまざまなコレクションのスレッド セーフについての深い理解

スレッドの安全性

まず第一に、スレッドの動作原理を理解する必要があります。メモリ、および各スレッドには独自の working

memory があります。スレッドが変数を操作するときは、独自の working

memory にコピーを作成し、それを main# に書き込む必要があります。

操作完了後。##メモリ。複数のスレッドが同じ変数を同時に操作すると、予期しない結果が発生する可能性があります。上記の説明に基づいて、対応するシナリオを思いつくのは簡単です。

synchronized を使用するための鍵は、モニターを作成することです。このモニターには、変更する変数や、メソッドなどの適切だと思われるその他のオブジェクトを指定し、モニターをロックしてスレッド セーフを実現します。各スレッドこのロックを取得した後、取得したロックが解放される前に、作業メモリへのロード→使用&割り当て→メインメモリへのストアという処理が実行されます。これにより、いわゆるスレッドセーフが実現されます。

スレッド セーフとは何ですか? スレッド セーフはどのように達成されるのですか (原理)? スレッド セーフとは、不確実な結果を生成することなく、複数のスレッドが同じコードにアクセスすることを意味します。スレッドセーフなコードを作成すると、スレッドの同期が低下します。

【推奨学習:

Java ビデオ チュートリアル

Java 関連コレクション

Vector、ArrayList、LinkedList

Vector と ArrayList は使用方法が非常に似ており、可変数のオブジェクト アプリケーションのセットを表すために使用でき、要素にランダムにアクセスできます。

Vector のメソッドはすべて同期 (Synchronized) されており、スレッド セーフですが、ArrayList のメソッドはそうではありません。スレッドの同期は必然的にパフォーマンスに影響を与えるため、ArrayList のパフォーマンスは Vector のメソッドよりも優れています。

ArrayList と LinkedList の違い

データ項目の列を処理するために、Java は ArrayList と LinkedList という 2 つのクラスを提供します。ArrayList の内部実装は、内部配列 Object[]. したがって、概念的には配列に似ていますが、LinkedList の内部実装は接続されたレコードのセットに基づいているため、リンク リスト構造に似ており、パフォーマンスに大きな違いがあります。

上記の分析から、ArrayList の前または途中にデータを挿入する場合は、それに応じてすべてのデータをその後ろに移動する必要があり、必然的に時間がかかることがわかります。データ列の前や中央ではなく後にデータを追加し、要素にランダムにアクセスする必要がある場合、ArrayList を使用するとパフォーマンスが向上します。

また、リンクされたリスト内の要素にアクセスする場合は、次の操作を開始する必要があります。リンクされたリストの一方の端から、必要な要素が見つかるまで接続方向に沿って要素ごとに検索します。したがって、データ列の前または途中でデータを追加または削除し、要素にアクセスする操作を行う場合は、どのような場合に、LinkedList を使用する必要があります。

プログラミング中に 1 と 2 の 2 つの状況が交互に現れる場合は、特定の実装を気にせずに List のような汎用インターフェイスを使用することを検討できます。特定の状況では、そのパフォーマンスは特定の実装によって決まります。

HashTable、HashMap、HashSet

HashTable と HashMap は同じストレージ メカニズムを使用しており、その実装は基本的に同じです。違いは次のとおりです:

1 )、HashMap はスレッドセーフではなく、HashTable はスレッドセーフであり、内部メソッドは基本的に同期されます。

2)、HashTable では null 値は許可されません。

HashTable で put メソッドを呼び出すとき、キーが null の場合、NullPointerException が直接スローされます。他にも、初期化された Entry 配列のサイズなど、微妙な違いがありますが、基本的な考え方は HashMap と同じです。

HashSet:

1. HashSet は HashMap に基づいて実装されており、容量制限はありません。

2. HashSet はスレッドセーフではありません。

3. HashSet は順序を保証しません。

HashMap:

1. HashMap は配列を使用して、キーと値で構成される Entry オブジェクトを容量制限なしで保存します。

2. HashMap は、キー ハッシュに基づいて配列内で Entry オブジェクトが格納されている場所を検索し、リンク リストを使用してハッシュの競合を解決します。

3. HashMap は要素を挿入するときに配列の容量を拡張する必要がある場合があります。容量を拡張する場合は、ハッシュを再計算し、オブジェクトを新しい配列にコピーする必要があります。

4. HashMap はスレッドセーフではありません。

5. HashMap トラバーサルは Iterator を使用します

HashTable

1. HashTable はスレッドセーフです。

2. HashTable の Key も Value も null にすることはできません。

3. HashTable のトラバーサルでは列挙を使用します。

TreeSet,TreeMap

TreeSet:

1. TreeSet は TreeMap に基づいて実装され、並べ替えをサポートします。

2. TreeSet はスレッドセーフではありません。

HashSet と TreeSet の説明から判断すると、TreeSet も HashSet と同様に完全に Map に基づいており、どちらも指定位置の要素を取得する get(int) をサポートしていません (取得するにはトラバースする必要があります)。いくつかの並べ替えサポートも追加されました。たとえば、Comparator 実装、decendingSet、decendingIterator などを渡します。

TreeMap:

1. TreeMap は赤黒ツリーに基づく典型的な Map 実装であるため、Key 比較メソッド、または Comparator 実装を渡す必要があります。または、キー オブジェクトが Comparable インターフェイスを実装します。

2. TreeMap はスレッドセーフではありません。

概要

上記は、さまざまな Java コレクションのスレッド セーフについて詳しく説明したこの記事の全内容です。

この記事は Java 入門 列からのものです。ぜひ学習してください。

以上がJava のさまざまなコレクションのスレッド セーフについての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はword666.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。