Java同步静态和非静态方法的行为

时间:2013-12-30 12:49:59

标签: java synchronize

根据我的理解,非静态方法的同步将在对象级别被阻止 静态方法上的synchronize将在类实例级别被阻止。

基于此,请在下面找到我对各种情况的理解:

  1. 非静态同步方法访问其他非静态同步方法也阻止

  2. 非静态同步方法访问然后非静态非同步方法不会阻止。

  3. 静态synchrnize方法访问然后阻止该类实例的其他同步(静态和非静态)方法。

  4. 静态同步方法访问然后其他非静态非同步方法不会阻塞。

  5. 静态同步方法访问然后其他静态非同步方法不会阻止。

  6. 静态同步方法访问然后阻止所有对象实例的非静态同步方法。

  7. 非静态synchrnize方法访问然后静态同步方法不阻止

  8. 请帮我验证一下。

3 个答案:

答案 0 :(得分:6)

我认为可以解释得更简单

1)当一个线程进入同步实例方法时,没有其他线程可以进入同一实例的任何同步实例方法

2)当线程进入同步静态方法时,没有其他线程可以进入同一类的任何同步静态方法

答案 1 :(得分:3)

静态同步方法只锁定表示该类的Class实例。锁定类不会阻止任何其他方法,例如非静态的。

e.g。

class MyClass {
    public static synchronized void method() {
        // something 
    }

相当于

class MyClass {
    public static void method() {
        synchronized(MyClass.class) {
            // something 
        }
    }

答案 2 :(得分:1)

有两种类型的锁:对象级别和类级别。

对象级锁定适用于非静态同步方法。在使用该方法时,每个对象都有一个锁,该对象首先获取锁,然后执行方法内的代码。

类级别锁适用于静态同步方法。每个类都有一个锁,在调用synchronized静态方法时使用。

以下是您的问题的答案:

  1. 静态同步方法无法访问非静态同步方法。但是非静态同步方法可以访问静态同步方法。如果我们访问静态同步方法,那么所有静态同步方法都会被阻塞,但我们可以访问其他静态和非静态方法。

  2. 静态同步方法访问不会阻止其他非静态,非同步的方法。

  3. 可以访问静态非同步方法。

  4. 如上所述,将阻止非静态同步方法。

  5. 对象级锁可以包含类级锁,这意味着非静态同步方法可以调用静态同步方法。