synchronized(this)和synchronized方法有什么区别

Tar*_*rik 29 java thread-safety

可以说我们有这两个示例代码:

public synchronized void getSomething(){
     this.hello = "hello World";
}
Run Code Online (Sandbox Code Playgroud)

还有这个

public void getSomething(){
   synchronized(this){
     this.hello = "hello World";
   }
}
Run Code Online (Sandbox Code Playgroud)

所以有人可以告诉我现在的区别是什么?

Mik*_*ark 38

两种不同的方法在功能上是等同的.有可能是一个非常小的性能差异:

在字节码级别,synchronized方法将其对同步的需要通告为方法的访问标志中的位集.JVM查找此位标志并进行适当的同步.

同步块通过存储在该方法的类文件中的字节码定义的操作序列实现其同步.

因此,同步方法可能执行得稍快一些,并且在字节码方面占用的空间更少.

同样,根据规范,这两者在功能上是相同的.

我猜测性能差异可以忽略不计,代码风格指南应该胜出.有些编译器甚至可能将块优化为访问标志.JIT可能会消除性能差异.

  • +1.最后一点机械细节:-) (2认同)

Car*_*n42 19

看看这篇文章的这一部分:

http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/#4

它解释了虽然功能一致(同步方法要么锁定实例对象,要么在静态方法的情况下锁定方法所在的类的Class对象),同步方法更加优化,因为它不是在字节码中同步(如同步块语句那样),它在JVM级别进行同步.


D.C*_*.C. 9

一个区别是同步的代码的粒度.在第一个示例中,您基本上是锁定整个方法,而在第二个示例中,只会锁定方法的一部分.对于不需要完全同步的长方法,第二种方法更好.最好只在需要时锁定,并尽快释放其他线程的锁.