为什么ArrayList和HashMap等类不同步?
我正在更新一个旧项目,我想知道是否应该在IDE中删除一些标记为“过时”的对象。 有问题的对象是Vector和Hashtable。 我做了一些研究,似乎这些对象的新对应物 – ArrayList和HashMap – 基本相同,只是没有同步。
我的问题是,为什么要进行切换? 我不是只是从我的应用程序中取走一点安全性以换取少量速度吗? 看起来这不是一个巨大的决定,但我想我会在做出决定之前看看是否值得花时间。
谢谢!
我不是只是从我的应用程序中取走一点安全性以换取少量速度吗?
如果您唯一的线程安全性依赖于Vector
和Hashtable
的同步,那么您几乎肯定会遇到麻烦。
通常,粗粒度操作需要同步 – “对集合上的每个小操作进行同步并希望足够好”的方法几乎不是所需要的,所以为什么要轻微拥有它呢?
如果您在线程之间共享可变数据(例如集合),则需要仔细考虑如何这样做 – 使用Vector
和Hashtable
会给您一种错误的安全感。
synchronized
会导致严重的性能损失,并且通常不是实现并发的最佳方法。
如果需要线程安全的集合,请使用java.util.concurrent
集合。
这篇文章可能会有所帮助。
我不是百分百肯定你得到了你认为自己的’安全’。 我通常发现我想自己做同步而不是依赖内置的东西(无论是Vector / Hashtable,还是Collections.synchronizedList(new ArrayList())/ Collections.synchronizedMap(new HashMap())) 。
我倾向于创建自己的锁定监视器并自己控制所有锁定。 如果我不这样做,我往往忘记锁定复杂的多步操作而不注意它。 我喜欢它如何强迫你考虑系统中的锁定 – 否则它变得容易’感觉’安全,而事实上你并非如此。 如果你做得不对,锁定就会让你陷入困境并成为一堆虫子。 值得额外考虑将锁定放在需要的位置,并了解锁定如何保护自己的访问权限。