同步(这个)和同步方法有什么区别

2022-09-01 11:30:41

假设我们有以下2个示例代码:

public synchronized void getSomething(){
     this.hello = "hello World";
}

和这个

public void getSomething(){
   synchronized(this){
     this.hello = "hello World";
   }
}

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


答案 1

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

在字节码级别,同步方法将其同步需求作为方法的访问标志中设置的位进行宣传。JVM 查找此位标志并相应地进行同步。

同步块通过存储在类文件的方法定义中的一系列字节码操作来实现其同步。

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

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

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


答案 2

查看本文的这一部分:

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

它解释了虽然在功能上是一致的(同步方法要么锁定实例 Object,要么在静态方法的情况下锁定方法所在的类的 Class 对象),但同步方法要理想得多,因为它不是在字节码中同步(如同步块语句所做的那样),而是在 JVM 级别进行同步。


推荐