Java:最好一次或多次锁定?

时间:2012-02-08 20:02:03

标签: java multithreading

我意识到这是一个有点笼统的问题,但请耐心等待。假设我必须将一堆项插入数据结构中。

  • 我可以一次插入一个,也可以一个巨大的批次插入。
  • 插入操作必须锁定我的数据结构。
  • 插入是从一个线程发生的。
  • 我没有任何关于从系统其他部分争用锁定的信息。

您认为最好是分批插入或逐个插入,或者无关紧要(......“更好”最小化插入时间和锁定保持时间)?

2 个答案:

答案 0 :(得分:2)

如果只有一个线程可以访问您的数据结构,那么您根本不需要锁定。

如果多个线程需要访问,那么“剂量”有多大:

  • 如果锁定每个项目,那么你有非常精细的粒度锁定,多个线程可能会交替更新列表,允许所有这些项目取得进展。但是,多次锁定和解锁将开始加起来。
  • 如果您锁定整个批次,则锁定的影响可以忽略不计,但如果批次很大,其他线程将被锁定,直到您完成整个更新。
  • 权衡可能是将大批量分成几个较小的批次,这样你就不会多次锁定,但是所有的线程都可以通过有机会获得一些进展批量更新之间的锁定。

答案 1 :(得分:0)

一般来说,使用锁定会保留操作的原子性。如果整个插入是从一个线程完成的,并且您希望确保插入所有项目而系统中没有其他线程可以在操作中间获取锁定 - 您应该选择巨型批处理。如果查看操作本身(仅获取锁定一次),这种选择也是性能方面的。 另一方面,如果系统的其他部分可能,当线程插入大批量,想要插入或执行任何其他需要锁定的操作时,它们将“饿死”。 所以它真的是整个系统的使用选择。如果你发现你是唯一一个使用锁的线程 - 你实际上可以解雇它......

希望它有所帮助。