JavaのArray ListとVectorクラスの両方がマルチスレッドの悪い選択だと知っています。私はArray Listが同期していないことを知っていました。それはマルチスレッドとうまくいかない理由です。私はマルチスレッドでJavaの同期化されたベクトルクラスのパフォーマンスが悪いのはなぜかを知りたい。Java Collectionのベクタークラスでマルチスレッド化のパフォーマンスが低下するのはなぜですか?
その背景には何がありますか?
JavaのArray ListとVectorクラスの両方がマルチスレッドの悪い選択だと知っています。私はArray Listが同期していないことを知っていました。それはマルチスレッドとうまくいかない理由です。私はマルチスレッドでJavaの同期化されたベクトルクラスのパフォーマンスが悪いのはなぜかを知りたい。Java Collectionのベクタークラスでマルチスレッド化のパフォーマンスが低下するのはなぜですか?
その背景には何がありますか?
ベクターは、すべてのメソッドごとにデータへのアクセスを個別に同期します。
同期はまったく必要ない場合がありますが、ベクターから削除することはできません。そのような場合、不要な同期にはまだコストがかかるため、Vectorは非効率的になります。
一方、メソッド呼び出しの全体シーケンスを同期させる必要がある場合があります。その後、Vectorのメソッドに対する個々の同期は役に立たず、パフォーマンスのコストも追加されます。
ArrayListは、マルチスレッドプログラムで使用できますが、外部同期で使用できます。
Java Concurrency in Prcticeを読むことをお勧めします。これは、外部/内部の同期、同時収集、および同期の方法の違いを実際に知るために必要な、もっと多くのアイデアを得るのに役立ちます。
アレイリストまたはリンクされたリストメソッドは外部で同期できますか? –
もちろん:両方のためにCollections.synchronizedList()を使用してください。 –