2011-06-22 54 views
2

可能重复:
How do synchronized static methods work in Java?Java的静态同步

有人可以让我了解以下两个功能之间的根本区别:

public static void synchronized f() {… } 

public void synchronized f() {… } 
+0

@ Oli链接中的[第二个答案](http://stackoverflow.com/questions/578904/how-do-synchronized-static-methods-work-in-java/582500#582500)直接回答了这个问题。 –

回答

12

public void synchronized f(){...} 

同步的情况下是每包围类的实例。这意味着多个线程可以调用f不同的类实例。

对于

public static void synchronized f(){...} 

在一个时间只有一个线程可以调用该方法,无论封闭类的实例的数量的。

技术上,通过​​在第一示例中所采取的显示器是对象实例和监视器的采取在第二个例子是,Class对象的。

需要注意的是,如果你有相同名称的类在不同ClassLoaders,该共享同一个显示器,但是这是你不可能遇到一个细节。

+0

是否有替代Java中的“synchronized”,比如说我们有相同的线程访问限制,没有使用“synchronized”关键字? – randon

+1

通过使用其中一个['Lock'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock),可以获得与'synchronized'相同的语义。 html)的实现。 –

1

我认为:

public void synchronized f() {… }同步于对象本身(this

public static void synchronized f() {… }同步上(object.getClass()SomeClass.getClass)的对象的Class实例

我可以是错误

+0

如果它是一个静态方法,this.getClass()'没有意义。我认为你的意思是'SomeClass.class'。 –

+0

@Mark是的,谢谢。我将编辑我的帖子。无论如何,我是否正确? – Thresh

0

假设方法f在Foo类中。静态版本将锁定类级别的静态方法调用(由getClass()或Foo.class返回的对象)。非静态版本将锁定为类的特定实例,所以可以说:

Foo x = new Foo(); 
Foo y = new Foo(); 
// Locks method f of instance x, but NOT for y. 
x.f(); 

在静态情况下到F(呼叫)将锁定两个版本,所以只有一个方法调用到f将在被执行一次。

+0

它不会“锁定静态方法调用”,它会锁定“.class”对象。 –