繁体   English   中英

java同步静态方法

[英]java syncrhonized static methods

如果我有这样的方法

public synchronized static foo()
{

}

编译好了。

所以这引出了两个问题

  1. 什么是同步? 班级还是其他什么?
  2. 你可以在一个类上同步,这也会锁定该类的所有对象。

比如你能做到这一点吗?

synchronized(Foo) // where Foo is a class
{
}

MyClass同步静态方法与synchronized(MyClass.class)块基本相同。 你的第二个例子应该改写为

synchronized(Foo.class) {
}

是正确的。

如果您希望防御类同步,则应该在类外部不可见的私有静态对象上进行同步。 这可以防止恶意代码通过在其类对象上执行synchronized来阻止静态方法,从而阻止合法方法。

至于“锁定所有对象”云,标志着非静态方法synchronized不会被一个静态的执行锁定synchronized方法,因为常规的synchronized方法锁定的对象的实例 ,而不是它的类。

是的,它正在同步Class对象。 您可以在任何Class对象上进行同步。 您可以使用其文字( Foo.class ),也可以使用Foo实例的getClass()方法。

有关synchronized的更多信息(该跟踪中的第二页包含有关哪些锁同步方法使用的信息): http//docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

  1. 它正在同步class对象,例如MyClass.class
  2. 不,它不会锁定类的对象

静态方法使用该类作为锁定对象。

Java语言规范的相关部分是8.4.3.6,“同步方法”

同步方法在执行之前获取监视器(第17.1节)。 对于类(静态)方法,使用与方法类的Class对象关联的监视器。 对于实例方法,使用与此关联的监视器(调用该方法的对象)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM