Java 嵌套同步的速度

Java 嵌套同步的速度,java,synchronized,Java,Synchronized,嵌套的同步块比普通的同步块进入快吗?或者,例如,以下哪个例程更快: void routine1(SyncClass a) { a.syncMethod1(); a.syncmethod2(); a.syncMethod1(); } void routine2(SyncClass a) { synchronized(a) { a.syncMethod1(); a.syncmethod2(); a.syncMethod1(); } } 这些方法是同步的

嵌套的同步块比普通的同步块进入快吗?或者,例如,以下哪个例程更快:

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

void routine2(SyncClass a) {
  synchronized(a) {
    a.syncMethod1();
    a.syncmethod2();
    a.syncMethod1();
  }
}
这些方法是同步的。我正在考虑在不需要线程安全的情况下使用线程安全对象。因此,并发级别不受影响


此外,答案是否取决于平台?

无论平台如何,您最好同步
尽可能使用最小的代码元素

synchronized
块中包装大量的同步调用将降低并发性(从而降低性能)。仅当需要同步特定的调用序列时才执行此操作


如果您关心的是并发性对性能的影响,那么我不知道哪个更快。然而,我认为您所描述的两种方法在性能上的差异是难以察觉的。

根据问题上留下的评论,答案似乎是肯定的。但有两个警告

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


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

只能减少并发性。@EJP微妙但有效!请记住,如果JVM认为合适,它可能会粗化监视器。获取显示器不是免费的,请您澄清一下您的语言好吗?在上下文中,更多的原子意味着更大或更小的同步代码块吗?@warren我根据你修改过的问题修改了我的答案;希望它能够证明是有用的。你必须考虑的是正确的第一时,细粒度同步。至于答案,routine2更快,除非JVM将监视器粗化并以与routine2相同的方式编译routine1。除非中间有一些代码,否则锁定/解锁没有固有的好处。@bestsss在什么情况下JVM会使监视器变粗糙,为什么以及这到底意味着什么?您有文档链接吗?监视器粗化是一种避免频繁进入监视器的技术,因为它不是免费操作,需要CAS。一旦你有了关键词(lock-grossen),谷歌往往会产生相当好的结果——所以最初的java6白皮书:粗化有用的地方:
Vector v。。。对于(int i=0;i@bestsss谢谢你的帮助。