假设我们有以下两个示例代码:
public synchronized void getSomething(){
this.hello = "hello World";
}还有这张
public void getSomething(){
synchronized(this){
this.hello = "hello World";
}
}那么现在有人能告诉我有什么不同吗?
发布于 2010-12-09 13:29:13
这两种不同的方法在功能上是等效的。可能会有非常小的性能差异:
在字节码级别,synchronized方法将其同步需求作为方法的访问标志中的一个位设置。JVM查找该位标志并进行适当的同步。
synchronized块通过存储在方法的类文件定义中的一系列字节码操作来实现其同步。
因此,就字节码而言,synchronized方法的执行速度可能会稍快一些,占用的空间也会更少。
同样,根据规范,这两者在功能上是相同的。
我猜性能差异可以忽略不计,代码风格指导原则应该会胜出。一些编译器甚至可能将块优化为一个访问标志。而JIT可能会消除性能差异。
发布于 2010-12-09 13:27:08
查看本文的这一部分:
http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/#4
它解释说,虽然同步方法在功能上是一致的(同步方法锁定在实例对象上,或者在静态方法的情况下,同步方法是方法所在类的类对象),但同步方法要优得多,因为它在JVM级别同步,而不是在字节码中同步(就像synchronized块语句那样)。
发布于 2010-12-09 13:01:03
一个不同之处在于同步代码的粒度。在第一个示例中,您实际上锁定了整个方法,而在第二个示例中,只锁定了方法的一部分。第二种方法更适合于主体不需要完全同步的长方法。最好只在需要时锁定,然后尽快释放其他线程的锁。
https://stackoverflow.com/questions/4394976
复制相似问题