除了(次要?)性能命中之外,为什么我会使用常规List而不是Collections.synchronizedList与List?
我正在处理的项目不到10万条,所以我不在乎,但如果有人(也许是我)选择对此进行分类,我需要记录行为。
除了性能(超过100k条目),为什么我不同步?
也就是说,使用synchronizedList会产生什么惩罚?有多糟糕?对于我目前的申请,这不是问题。如果它是一个便宜的添加,为什么不呢?
答案 0 :(得分:2)
除了(次要?)表演之外......
实际上,如果列表是在线程之间共享的,那么使用简单的同步列表(相对于更合适的列表)的性能可能是大性能命中,具体取决于您正在做什么。同步操作可能成为并发瓶颈,将应用程序降低到单核的性能。
在设计多线程应用程序时,简单的“黑白”规则是不够的......或者是一个可重用的库,需要在多线程应用程序中具有线程安全性和高性能。
也就是说,使用synchronizedList会产生什么惩罚?有多糟糕?对于我目前的申请,这不是问题。如果它是一个便宜的添加,为什么不呢?
synchronized list类使用原始对象锁定(互斥锁)。
如果锁是无效的,这很便宜;每次获得并释放锁定时,可能会有5或10条指令。但是,ovehead 可能取决于锁上是否存在之前的争用。 (某些锁定方案会在第一次发生争用时导致对象锁定“膨胀”...)
如果锁争用,那么它会更昂贵,因为这通常会导致被阻塞的线程被解除调度和重新安排......以及上下文切换开销。还有另一种涉及“自旋锁定”的JVM级实现方法,但这需要阻塞线程在紧密循环中测试锁定对象。
如果锁持有很长时间(例如在list.contains中......为了长列表。)那么这通常会增加争用的概率。
答案 1 :(得分:1)
当您不需要同步时,或者当您不自欺欺人时,即使在迭代时,同步列表也是线程安全的,但它并不是。