类具有静态方法和非静态方法,它们是同步的。两个线程试图访问这些方法,他们能够做到吗?有什么锁?什么类型的锁?
答案 0 :(得分:2)
它们将被同步,但是在不同的对象上,因此不会同时保护它们。
实例方法在对象实例上同步,而静态方法在类对象上同步。
如果您希望两者之间的公共同步使用synchronized子句中的公共锁定对象。例如,您可以在类对象上同步。
答案 1 :(得分:1)
在方法上使用单词synchronized
时,实际上锁定了this
实例方法和类本身的静态方法。
例如:
public class MyClass {
public synchronized void foo1() {}
public synchronized void foo2() {}
}
在此示例中,只有一个线程可以输入同一实例的foo1()
或foo2()
。所以,如果我们有这样的事情:
MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();
因此,foo1()
中的某个帖子可能位于instance1
而另一个帖子位于foo1()
的{{1}}中。但是,2个主题不可能在instance2
上输入foo1
AND instance1
的{{1}}。因为他们都使用foo2
锁定。
静态方法也是如此,相反,它们会锁定类本身。含义 - 一个线程可以在某个点输入instance1
静态方法。