注目記事

【Javaコード入門】コレクションフレームワーク_③synchronizedList/synchronizedMap/synchronizedSetメソッド

コレクションをマルチスレッド環境でも利用できるようにする – synchronizedList/synchronizedMap/synchronizedSetメソッド

public static <T> List<T> synchronizedList(List<T> list)
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
public static <T> Set<T> synchronizedSet(Set<T> s)
 T、K、V:要素型
 list、m、s:変換対象のコレクション

コレクションフレームワークで提供されている実装クラスのほとんどは、デフォルトでは、マルチスレッド環境に対応していません。これは、シングルスレッド環境でマルチスレッドのための対応(=排他処理)を施すのは無駄なことであり、パフォーマンスが劣化する原因にもなるためです。
そこで、コレクションフレームワークの実装クラスをマルチスレッド環境で利用する場合には、synchronizedList/synchronizedMap/synchronizedSetメソッドを介して、マルチスレッド対応のリスト/マップ/セットに変換しなければなりません。このようなコレクションのことを同期化コレクションと言います。
例えば以下は、リスト(ArrayList)を同期化コレクションに変換した例です。

CollSynchronized.java(抜粋)

  1. package com.example.mynavi.collection;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.List;
  6.  
  7. public class CollSynchronized {
  8.  
  9.   public static void main(String[] args) {
  10.     var = Collections.synchronizedList(new ArrayList<>());
  11.     list.add("Windows");
  12.     list.add("Linux");
  13.     list.add("macOS");
  14.     System.out.println(list);   // 結果:[Windows, Linux, macOS]
  15.   }
  16. }

ちなみに、java.util.concurrentパッケージでは、以下のような並列コレクションも用意されています。最初からスレッドセーフなコレクションを生成するならば、これらのクラスを利用しても良いでしょう。

  1. var list = new CopyOnWriteArrayList<String>();
  2. var map = new ConcurrentHashMap<String, String>();
コレクションフレームワーク_目次
コレクションフレームワーク
コレクションを初期化する
synchronizedList/synchronizedMap/synchronizedSetメソッド
ArrayListクラス
asListメソッド
toArrayメソッド
LinkedList
HashMap
TreeMap
NavigableMap
HashSet
ArrayDeque

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。