Java Vector (および Stack) クラスが廃止または非推奨とみなされるのはなぜですか? 質問する

Java Vector (および Stack) クラスが廃止または非推奨とみなされるのはなぜですか? 質問する

Java Vector がレガシー クラス、廃止済み、または非推奨と見なされるのはなぜですか?

並行処理を扱う場合にはその使用は有効ではないでしょうか?

また、オブジェクトを手動で同期せず、基礎となる配列の新しいコピーを作成する必要なくスレッドセーフなコレクションを使用したいだけの場合はCopyOnWriteArrayList、 を使用しても大丈夫でしょうかVector?

Stackのサブクラスである の場合はVector、代わりに何を使用すればよいでしょうか?

ベストアンサー1

Vector個々の操作ごとに同期します。これは、ほとんどの場合、望ましいことではありません。

一般的に、一連の操作全体Vectorを同期する必要があります。個々の操作を同期すると、安全性が低くなります (たとえば、 を反復処理する場合、他のユーザーが同時にコレクションを変更して反復スレッドConcurrentModificationExceptionで が発生するのを回避するために、依然としてロックを取得する必要があります)。また、速度も遅くなります (1 回で十分なのに、なぜ繰り返しロックを取得するのでしょうか)。

もちろん、必要がない場合でもロックするというオーバーヘッドもあります。

基本的に、これはほとんどの状況で同期化に対する非常に欠陥のあるアプローチです。Brian Henk氏が指摘したように、次のような呼び出しを使用してコレクションを装飾することができます。Collections.synchronizedList- 「サイズ変更された配列」コレクション実装と「すべての操作を同期する」ビットの両方を組み合わせることは、Vector設計の不備のもう 1 つの例です。装飾アプローチにより、関心の分離がより明確になります。

同等のものについては、まず/Stackを見てください。DequeArrayDeque

おすすめ記事