同步成本

时间:2010-12-04 17:05:13

标签: java synchronization synchronized

在一个高度并发的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();

3 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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