可能重复:
How do synchronized static methods work in Java?Java的静态同步
有人可以让我了解以下两个功能之间的根本区别:
public static void synchronized f() {… }
和
public void synchronized f() {… }
可能重复:
How do synchronized static methods work in Java?Java的静态同步
有人可以让我了解以下两个功能之间的根本区别:
public static void synchronized f() {… }
和
public void synchronized f() {… }
在“静态synchnronized”方法中,同步的锁定在类本身上;在“synchornized”方法中,锁定在对象上。请注意,这意味着“静态同步”方法不会被正在运行的“同步”方法阻止,反之亦然。有关详细信息,请参见:http://geekexplains.blogspot.com/2008/07/synchronization-of-static-and-instance.html
在
public void synchronized f(){...}
同步的情况下是每包围类的实例。这意味着多个线程可以调用f
对不同的类实例。
对于
public static void synchronized f(){...}
在一个时间只有一个线程可以调用该方法,无论封闭类的实例的数量的。
技术上,通过在第一示例中所采取的显示器是对象实例和监视器的采取在第二个例子是,Class
对象的。
需要注意的是,如果你有相同名称的类在不同ClassLoaders
,该不共享同一个显示器,但是这是你不可能遇到一个细节。
是否有替代Java中的“synchronized”,比如说我们有相同的线程访问限制,没有使用“synchronized”关键字? – randon
通过使用其中一个['Lock'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock),可以获得与'synchronized'相同的语义。 html)的实现。 –
我认为:
public void synchronized f() {… }
同步于对象本身(this
)
public static void synchronized f() {… }
同步上(object.getClass()
或SomeClass.getClass
)的对象的Class
实例
我可以是错误
如果它是一个静态方法,this.getClass()'没有意义。我认为你的意思是'SomeClass.class'。 –
@Mark是的,谢谢。我将编辑我的帖子。无论如何,我是否正确? – Thresh
假设方法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将在被执行一次。
它不会“锁定静态方法调用”,它会锁定“.class”对象。 –
@ Oli链接中的[第二个答案](http://stackoverflow.com/questions/578904/how-do-synchronized-static-methods-work-in-java/582500#582500)直接回答了这个问题。 –