静态和非静态方法的同步

时间:2014-02-19 21:57:35

标签: java static synchronization

类具有静态方法和非静态方法,它们是同步的。两个线程试图访问这些方法,他们能够做到吗?有什么锁?什么类型的锁?

2 个答案:

答案 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静态方法。