何时是使用Collections.synchronizedList与List的错误时间?

时间:2014-10-11 01:28:53

标签: java list synchronized

除了(次要?)性能命中之外,为什么我会使用常规List而不是Collections.synchronizedList与List?

我正在处理的项目不到10万条,所以不在乎,但如果有人(也许是我)选择对此进行分类,我需要记录行为。

除了性能(超过100k条目),为什么我不同步?

也就是说,使用synchronizedList会产生什么惩罚?有多糟糕?对于我目前的申请,这不是问题。如果它是一个便宜的添加,为什么不呢?

2 个答案:

答案 0 :(得分:2)

  

除了(次要?)表演之外......

实际上,如果列表是在线程之间共享的,那么使用简单的同步列表(相对于更合适的列表)的性能可能是性能命中,具体取决于您正在做什么。同步操作可能成为并发瓶颈,将应用程序降低到单核的性能。

在设计多线程应用程序时,简单的“黑白”规则是不够的......或者是一个可重用的库,需要在多线程应用程序中具有线程安全性和高性能。


  

也就是说,使用synchronizedList会产生什么惩罚?有多糟糕?对于我目前的申请,这不是问题。如果它是一个便宜的添加,为什么不呢?

synchronized list类使用原始对象锁定(互斥锁)。

  • 如果锁是无效的,这很便宜;每次获得并释放锁定时,可能会有5或10条指令。但是,ovehead 可能取决于锁上是否存在之前的争用。 (某些锁定方案会在第一次发生争用时导致对象锁定“膨胀”...)

  • 如果锁争用,那么它会更昂贵,因为这通常会导致被阻塞的线程被解除调度和重新安排......以及上下文切换开销。还有另一种涉及“自旋锁定”的JVM级实现方法,但这需要阻塞线程在紧密循环中测试锁定对象。

  • 如果锁持有很长时间(例如在list.contains中......为了长列表。)那么这通常会增加争用的概率

答案 1 :(得分:1)

当您不需要同步时,或者当您不自欺欺人时,即使在迭代时,同步列表也是线程安全的,但它并不是。