同步成本

在一个高度并发的Java程序中,并假设我的方法正确编写并正确同步,我想知道如何确定哪个更好:

void synchronized something() { ... } 

要么

 void something() { synchronized(this) { ... } // here do stuff no requiring synchronization . . // do computation 'A' . synchronized(this) { ... } // here do other stuff no requiring synchronization . . // do computation 'B' . synchronized(this) { ... } } 

现在我意识到如果计算’A’和’B’需要花费很多时间,那么第二个版本显然更好。

然而,我的问题是:你知道第二个版本更高效吗?

第二个版本总是更快还是有几次获取/释放锁的隐藏成本?

如果我的计算’A’只是一些简单的事情,那该怎么办?

 s.getString().substring( 0, 2 ).toLowerCase(); 

是的, synchronized成本时间。 如果实际计算很简单并且它在一个循环内,那么与实际计算相比,它会花费大量时间。

请参阅此示例: http : //ideone.com/zgpB7

  • 内部部件同步:约0.025秒
  • 整循环同步:小于0.001s

要确定哪一个更适合您的程序,让它执行一些东西,看看哪个时间更快。

thejh提出了重复锁定线程需要一些成本的好处。 但是,每当我与人们谈论并行线程时,它总是要确保所有线程在同时运行时快速执行。

保持锁定的时间超过了所需的时间,可以减慢其他线程的速度。 当你做的工作不会干扰他们想做的工作时,他们必须等待。 如果这是毫秒对您来说实际上很重要的情况,您应该使用分析器来查看根据您的情况最有效的方法。 multithreading优化是存在通常适用的“最佳实践”的情况之一,但是您不会获得适用于所有情况的规则。 如果你需要那么多的粒度,你应该测试它并看看。

“正确写入”和“正确同步”是否意味着多同步情况下代码部分之间没有依赖关系? 如果存在依赖关系,那么多同步的情况可能会导致违反不变量。 换句话说,你能保证多同步案例的执行不会导致某些对象处于无效状态吗? 如果没有,那么单一同步的情况可能会更好。