HOWTO · Java

Java のスレッドセーフなコレクション

このチュートリアルでは、Java のコード例を使用して、さまざまなスレッド セーフなコレクション クラスについて説明します。

Java では、thread-safe は、複数のスレッドが同時に呼び出されている間、クラスの内部状態とメソッドの値が正しいことを保証するクラスです。

このチュートリアルでは、Java で スレッドセーフ なコード例を使用して、さまざまなコレクション クラスについて説明します。

Java のスレッド セーフ コレクション

Java で最も人気のある thread-safe コレクション クラスは、VectorStackHashtableProperties などです。以下の Vector から始めて、それぞれを学びましょう。

スレッド セーフ コレクション クラス - Vector

Vector は、必要に応じて拡張できるオブジェクトの配列です。 このクラスは、add()remove()get()elementAt()size() などのメソッドをサポートしています。

コード例:

// Importing necessary packages
import java.util.*;

public class JavaVector {
  public static void main(String[] arg) {
    // Declaring a vector
    Vector MyVector = new Vector();

    // Adding data to vector
    MyVector.add(12);
    MyVector.add(3);
    MyVector.add("ABC");
    MyVector.add(10);
    MyVector.add("DEF");
    System.out.println("The vector is: " + MyVector);

    // Removing data from the vector.
    MyVector.remove(1);
    System.out.println("The vector after removing an element is: " + MyVector);
  }
}

出力:

The vector is: [12, 3, ABC, 10, DEF]
The vector after removing an element is: [12, ABC, 10, DEF]

スレッド セーフ コレクション クラス - Stack

Stack クラスは、スタック データ構造を実装します。 LIFO または Last In First Out に基づいています。 Stack クラスの最も一般的な操作は、push()pop()empty()、および search() です。

コード例:

// Importing necessary packages
import java.util.*;

public class JavaStack {
  public static void main(String[] args) {
    // Declaring a stack
    Stack<Integer> MyStk = new Stack<Integer>();

    // Adding data to stack
    MyStk.push(5);
    MyStk.push(7);
    MyStk.push(9);

    // POP from the stack
    Integer num1 = (Integer) MyStk.pop();
    System.out.println("The Popped element is: " + num1);

    // PUSH the stack
    Integer num2 = (Integer) MyStk.peek();
    System.out.println("The top element is: " + num2);
  }
}

出力:

The popped element is: 9
The top element is: 7

スレッド セーフ コレクション クラス - Hashtable

Java Hashtable クラスは、keysvalues にマップするハッシュ テーブルを実装します。 さらに、Map インターフェイスを実装し、ディレクトリを継承します。

コード例:

// Importing necessary packages
import java.util.*;

public class JavaHashtable {
  public static void main(String args[]) {
    // Declaring a HashTable
    Hashtable<Integer, String> HTable = new Hashtable<Integer, String>();

    // Adding data to HashTable
    HTable.put(100, "This");
    HTable.put(102, "is");
    HTable.put(101, "a");
    HTable.put(103, "data");

    for (Map.Entry MyMap : HTable.entrySet()) {
      // Extracting data and keys from the HashTable
      System.out.println(MyMap.getKey() + " " + MyMap.getValue());
    }
  }
}

出力:

103 data
102 is
101 a
100 This

スレッド セーフ コレクション クラス - Synchronize HashMap

Java で スレッドセーフ コレクションとして使用できる HashMap の同期バージョンがあります。 この HashMapSynchronize HashMap と最もよく似た働きをします。

コード例:

// Importing necessary packages
import java.util.*;

public class JavaHashMap {
  public static void main(String[] args) throws Exception {
    try {
      // Declaring a HashMap
      Map<String, String> HMap = new HashMap<String, String>();

      // Adding values to the HashMap
      HMap.put("1", "This");
      HMap.put("2", "is");
      HMap.put("3", "a");
      HMap.put("4", "sample");
      HMap.put("5", "data");

      // Printing the value of HashMap
      System.out.println("The Map is : " + HMap);

      // Synchronizing the HashMap
      Map<String, String> SMap = Collections.synchronizedMap(HMap);

      // Printing the Collection after synchronizing the HashMap
      System.out.println("The synchronized map is : " + SMap);
    } catch (IllegalArgumentException e) {
      // Printing exception if necessary
      System.out.println("Exception thrown : " + e);
    }
  }
}

出力:

The Map is : {1=This, 2=is, 3=a, 4=sample, 5=data}
The synchronized map is : {1=This, 2=is, 3=a, 4=sample, 5=data}