为什么ArrayList和HashMap等类不同步?

我正在更新一个旧项目,我想知道是否应该在IDE中删除一些标记为“过时”的对象。 有问题的对象是Vector和Hashtable。 我做了一些研究,似乎这些对象的新对应物 – ArrayList和HashMap – 基本相同,只是没有同步。

我的问题是,为什么要进行切换? 我不是只是从我的应用程序中取走一点安全性以换取少量速度吗? 看起来这不是一个巨大的决定,但我想我会在做出决定之前看看是否值得花时间。

谢谢!

我不是只是从我的应用程序中取走一点安全性以换取少量速度吗?

如果您唯一的线程安全性依赖于VectorHashtable的同步,那么您几乎肯定会遇到麻烦。

通常,粗粒度操作需要同步 – “对集合上的每个小操作进行同步并希望足够好”的方法几乎不是所需要的,所以为什么要轻微拥有它呢?

如果您在线程之间共享可变数据(例如集合),则需要仔细考虑如何这样做 – 使用VectorHashtable会给您一种错误的安全感。

synchronized会导致严重的性能损失,并且通常不是实现并发的最佳方法。

如果需要线程安全的集合,请使用java.util.concurrent集合。

这篇文章可能会有所帮助。

我不是百分百肯定你得到了你认为自己的’安全’。 我通常发现我想自己做同步而不是依赖内置的东西(无论是Vector / Hashtable,还是Collections.synchronizedList(new ArrayList())/ Collections.synchronizedMap(new HashMap())) 。

我倾向于创建自己的锁定监视器并自己控制所有锁定。 如果我不这样做,我往往忘记锁定复杂的多步操作而不注意它。 我喜欢它如何强迫你考虑系统中的锁定 – 否则它变得容易’感觉’安全,而事实上你并非如此。 如果你做得不对,锁定就会让你陷入困境并成为一堆虫子。 值得额外考虑将锁定放在需要的位置,并了解锁定如何保护自己的访问权限。