Par*_*rag 3 java collections thread-safety
Java中新的Collections库中是否存在牺牲线程安全性以外的其他原因?
是的,还有另一个原因.使集合的每个方法同步使集合线程安全,但是
此外,线程安全性根本没有牺牲,因为您只需要将ArrayList(例如)包装在同步的集合代理中,以获得与旧的相同的同步保证,默认情况下同步Vector:
List<String> list = Collections.synchronizedList(new ArrayList<String>());
Run Code Online (Sandbox Code Playgroud)
因此,您可以充分利用两者:快速收集(当您不需要同步时(99%的情况))和同步收集(如果您需要).
表现是主要原因.
但是,还有一个重要的哲学/设计原因:仅通过使各个集合类线程安全,您无法实现完整的线程安全性.
安全并发代码通常需要在不同级别进行同步,例如:
因此,在某种程度上,使集合类同步将是一个相当随意的决定,不适合许多(如果不是大多数)情况.因此,这是一个更好的选择,使集合不安全,让用户决定他们的并发策略(无论是否需要,适当的粒度级别,交易方法等)
除此之外,另一个选择是采用Clojure开创的方法并使用不可变的持久集合类,因此您根本不必担心锁或线程安全.但是,这需要对你的国家方法进行更多的批判性重新思考....
为什么表现不够好?
强制线程"安全"(大多数情况下可能不完整 - 例如没有putIfAbsent)被删除,因此您不必在不需要时支付费用,但仍然可以选择制作东西当你这样做时,你自己就是线程安全的(并且具有你选择的粒度).
我想,实现的是没有办法在自动线程安全中进行烘焙,不需要程序员考虑它,可以在所有情况下使用,可靠地工作并且不会增加显着的开销.
另请注意,"更新"的并发工具包带来了一些新的线程安全的集合实现,这些实现用于非常特定的目的.同样,您需要不同的工具来完成不同的任务,旧的集合类提供了一个非常差的中间层,并不适合大多数应用程序.