コレクションをマルチスレッド環境でも利用できるようにする – 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(抜粋)
- package com.example.mynavi.collection;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class CollSynchronized {
- public static void main(String[] args) {
- var = Collections.synchronizedList(new ArrayList<>());
- list.add("Windows");
- list.add("Linux");
- list.add("macOS");
- System.out.println(list); // 結果:[Windows, Linux, macOS]
- }
- }
ちなみに、java.util.concurrentパッケージでは、以下のような並列コレクションも用意されています。最初からスレッドセーフなコレクションを生成するならば、これらのクラスを利用しても良いでしょう。
- var list = new CopyOnWriteArrayList<String>();
- 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万部を超える。