Java Vector がレガシー クラス、廃止済み、または非推奨と見なされるのはなぜですか?
並行処理を扱う場合にはその使用は有効ではないでしょうか?
また、オブジェクトを手動で同期せず、基礎となる配列の新しいコピーを作成する必要なくスレッドセーフなコレクションを使用したいだけの場合はCopyOnWriteArrayList
、 を使用しても大丈夫でしょうかVector
?
Stack
のサブクラスである の場合はVector
、代わりに何を使用すればよいでしょうか?
ベストアンサー1
Vector
個々の操作ごとに同期します。これは、ほとんどの場合、望ましいことではありません。
一般的に、一連の操作全体Vector
を同期する必要があります。個々の操作を同期すると、安全性が低くなります (たとえば、 を反復処理する場合、他のユーザーが同時にコレクションを変更して反復スレッドConcurrentModificationException
で が発生するのを回避するために、依然としてロックを取得する必要があります)。また、速度も遅くなります (1 回で十分なのに、なぜ繰り返しロックを取得するのでしょうか)。
もちろん、必要がない場合でもロックするというオーバーヘッドもあります。
基本的に、これはほとんどの状況で同期化に対する非常に欠陥のあるアプローチです。Brian Henk氏が指摘したように、次のような呼び出しを使用してコレクションを装飾することができます。Collections.synchronizedList
- 「サイズ変更された配列」コレクション実装と「すべての操作を同期する」ビットの両方を組み合わせることは、Vector
設計の不備のもう 1 つの例です。装飾アプローチにより、関心の分離がより明確になります。
同等のものについては、まず/Stack
を見てください。Deque
ArrayDeque