2012-06-17 60 views
3

嵌套同步块是否比正常同步块更快进入?或者,例如,以下哪个例程更快:嵌套同步的速度

void routine1(SyncClass a) { 
    a.syncMethod1(); 
    a.syncmethod2(); 
    a.syncMethod1(); 
} 

void routine2(SyncClass a) { 
    synchronized(a) { 
    a.syncMethod1(); 
    a.syncmethod2(); 
    a.syncMethod1(); 
    } 
} 

这些方法是同步的。我正考虑在不需要线程安全的情况下使用线程安全对象。所以并发级别不受影响。

另外,答案平台是否依赖?

+0

你必须考虑的是在进行细粒度同步时的正确性。至于答案例程2速度更快,除非JVM粗加显示器并像例程2那样编译例程1。锁定/解锁没有固有的好处,除非中间有一些代码。 – bestsss

+0

@bestsss在什么情况下JVM会使显示器变得粗大,以及为什么,究竟是什么意思?你有链接到文档? – warren

+0

显示器粗化是一种避免频繁进入显示器的技术,因为它不是免费的操作,需要CAS。一旦你有关键字(锁定变粗),谷歌往往会产生相当不错的结果 - 所以最初的java6白皮书:http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.1.2 – bestsss

回答

0

看来,答案是肯定的,因为对问题留下的评论。但有两个警告。

1)由于并行执行的机会较少,线程可能更频繁地彼此等待。

2)编译器可以自动优化这种方式。

1

无论平台如何,您最好在​​之前选择最小的代码元素,无论性能如何。

在​​块中包含若干同步调用会降低并发性(并因此降低性能)。只有在您需要特定的呼叫序列进行同步时才能执行此操作。

如果您担心除了之外的并发性,我不知道哪个更快。然而,我认为你所描述的两种方法在性能上的差异是不可察觉的。

+0

只能降低*并发性*。 – EJP

+0

@EJP微妙而有效!固定。 – cheeken

+0

请记住,如果JVM看起来合适,它可能会粗化显示器。获取显示器不是免费的 – bestsss