首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >synchronized(this)和synchronized方法有什么区别

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

Stack Overflow用户
提问于 2010-12-09 12:56:12
回答 3查看 17.8K关注 0票数 30

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

代码语言:javascript
复制
public synchronized void getSomething(){
     this.hello = "hello World";
}

还有这张

代码语言:javascript
复制
public void getSomething(){
   synchronized(this){
     this.hello = "hello World";
   }
}

那么现在有人能告诉我有什么不同吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-09 13:29:13

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

在字节码级别,synchronized方法将其同步需求作为方法的访问标志中的一个位设置。JVM查找该位标志并进行适当的同步。

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

因此,就字节码而言,synchronized方法的执行速度可能会稍快一些,占用的空间也会更少。

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

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

票数 38
EN

Stack Overflow用户

发布于 2010-12-09 13:27:08

查看本文的这一部分:

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

它解释说,虽然同步方法在功能上是一致的(同步方法锁定在实例对象上,或者在静态方法的情况下,同步方法是方法所在类的类对象),但同步方法要优得多,因为它在JVM级别同步,而不是在字节码中同步(就像synchronized块语句那样)。

票数 19
EN

Stack Overflow用户

发布于 2010-12-09 13:01:03

一个不同之处在于同步代码的粒度。在第一个示例中,您实际上锁定了整个方法,而在第二个示例中,只锁定了方法的一部分。第二种方法更适合于主体不需要完全同步的长方法。最好只在需要时锁定,然后尽快释放其他线程的锁。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4394976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档