

お世話になります。  
表題の件ですが、javaのマルチスレッド環境下にて  
new ArrayList()のインスタンス変数を使用したため、ConcurrentModificationExceptionが発生しました。  
そして、メソッド内の変数にnew ArrayList()を使用すればローカル変数となるので、スレッドセーフになると伺いました。  
そこでなのですが、ArrayListは非同期のクラスですが、それでもメソッド内であればスレッドセーフの変数としてしようできるのでしょうか。お教えください


CC BY-SA 4.0
2018-11-01T14:52:29.243
49869
2018-11-01T16:02:05.813
17281
question
java
マルチスレッドの変数のスコープについて


**短い答え**
：`ArrayList`は本質的にスレッドセーフではありません。スレッドセーフなListが必要な場合は、`Collections.synchronizedList`を利用してください。

[code]

    List<X> list = Collections.synchronizedList(new ArrayList<>());
    
[/code]

* * *

> メソッド内の変数にnew ArrayList()を使用すればローカル変数となるので、スレッドセーフになると伺いました。

誤りです。変数のスコープと、スレッドセーフには何の相関もありません。スレッドセーフか否かは、該当クラスやメソッドの外部仕様として決まっている性質です。

> ArrayListは非同期のクラスですが、それでもメソッド内であればスレッドセーフの変数としてしようできるのでしょうか。

いいえ。ただし、あるインスタンスがメソッド内ローカル変数からしか参照されないのであれば、他スレッドから操作できませんから、結果的に事故が起きないというだけです。


CC BY-SA 4.0
2018-11-01T15:56:58.073
49871
2018-11-01T16:02:05.813
2018-11-01T16:02:05.813
49
49
49869
answer