1

古いプロジェクトを更新していますが、IDEで「廃止」とマークされたオブジェクトを削除する必要があるかどうか疑問に思っています。問題のオブジェクトはVectorとHashtableです。私はいくつかの調査を行いましたが、これらのオブジェクトの新しい対応物であるArrayListとHashMapは基本的に同じであり、同期されていないようです。

私の質問は、なぜ切り替えを行う必要があるのか​​ということです。少しの速度と引き換えに、アプリケーションからセキュリティを少し取り除いただけではありませんか?どちらにしても記念碑的な決断ではないようですが、決断を下す前に時間の価値があるかどうかを確認したいと思いました。

ありがとう!

4

4 に答える 4

11

少しの速度と引き換えに、アプリケーションからセキュリティを少し取り除いただけではありませんか?

Vector唯一のスレッドセキュリティがとの同期に依存しているHashtable場合は、ほぼ確実に問題が発生しています。

通常、より粗い操作を同期する必要があります。「コレクションの各小さな操作を同期し、それで十分であることを期待する」アプローチが必要になることはほとんどありません。

スレッド間で変更可能なデータ(コレクションなど)を共有している場合は、その方法を慎重に検討する必要があります。これを使用するVectorHashtable、誤った安心感が得られる可能性があります。

于 2012-06-20T18:08:03.430 に答える
2

synchronizedパフォーマンスが大幅に低下するため、多くの場合、並行性に対する最善のアプローチではありません。

スレッド セーフなコレクションが必要な場合は、 のコレクションを使用してjava.util.concurrentください。

この記事が何かの役に立つかもしれません。

于 2012-06-20T18:10:09.000 に答える
1

あなたが思っているような「セキュリティ」を得ているかどうか、100% 確信があるわけではありません。私は通常、組み込みのもの (Vector/Hashtable、または Collections.synchronizedList(new ArrayList())/Collections.synchronizedMap(new HashMap())) に依存するのではなく、自分で同期を行いたいことがわかりました。 .

私は、独自のロック モニターを作成し、すべてのロックを自分で制御することを好む傾向があります。そうしないと、複雑で多段階の操作をロックするのを忘れてしまい、それに気付かないことがよくあります。システムのロックについて考えるよう強制する方法が気に入っています。ロックは、正しく行わないと本当に混乱し、バグの巣になる可能性があります。ロックが必要な場所にロックを配置し、ロックによってアクセスがどのように保護されているかを理解することは、十分に検討する価値があります。

于 2012-06-20T18:16:32.903 に答える