同步成本

Syn*_*r0r 10 java synchronization synchronized

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

void synchronized something() {
     ...
}
Run Code Online (Sandbox Code Playgroud)

要么

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) {
         ...
     }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果我的计算'A'只是一些微不足道的事情,那该怎么办?

s.getString().substring( 0, 2 ).toLowerCase();
Run Code Online (Sandbox Code Playgroud)

the*_*ejh 8

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

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

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

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

  • 该示例显示的另一件事是1,000,000个同步锁定需要0.024秒.因此,除非您迭代数百万次,否则您在线程之间存在可保持的资源争用,同步本身实际上并不那么慢.(显然每台机器上的锁定为0.000000024秒). (5认同)
  • 注意,JVM仍然可以将后续同步块组合成一个大块.有关此内容的更多信息,请访问http://www.ibm.com/developerworks/java/library/j-jtp10185/(锁定粗化). (2认同)