質問: お世話になります。 表題の件ですが、javaのマルチスレッド環境下にて new ArrayList()のインスタンス変数を使用したため、ConcurrentModificationExceptionが発生しました。 そして、メソッド内の変数にnew ArrayList()を使用すればローカル変数となるので、スレッドセーフになると伺いました。 そこでなのですが、ArrayListは非同期のクラスですが、それでもメソッド内であればスレッドセーフの変数としてしようできるのでしょうか。お教えください
回答: **短い答え**:`ArrayList`は本質的にスレッドセーフではありません。スレッドセーフなListが必要な場合は、`Collections.synchronizedList`を利用してください。 ``` List list = Collections.synchronizedList(new ArrayList<>()); ``` > > メソッド内の変数にnew ArrayList()を使用すればローカル変数となるので、スレッドセーフになると伺いました。 > > > 誤りです。変数のスコープと、スレッドセーフには何の相関もありません。スレッドセーフか否かは、該当クラスやメソッドの外部仕様として決まっている性質です。 > > ArrayListは非同期のクラスですが、それでもメソッド内であればスレッドセーフの変数としてしようできるのでしょうか。 > > > いいえ。ただし、あるインスタンスがメソッド内ローカル変数からしか参照されないのであれば、他スレッドから操作できませんから、結果的に事故が起きないというだけです。