2017-08-09 159 views
1

我对于synhronization(静态和非静态方法)的行为有点困惑。关于静态和非静态方法的Java同步

例如:

1.

class MyClass { 
    ... 
    public synchronized static someMethod() { 
    ... 
    } 
    public static someMethod2() { 
    ... 
    } 

    ... 
} 

因此,如果线程A呼叫someMethod1(),并线程B对someMethod2锁()?

2.

 class MyClass { 
    ... 
    public synchronized someMethod() { 
    ... 
    } 
    public someMethod2() { 
    ... 
    } 

    ... 
} 

如果我们有一个MyClass的=新MyClass的(),线程A调用方法的someMethod(),并线对someMethod2锁()?

回答

1

两者的答案都是否定的。同步是一种合作机制。在实例或类上同步不会阻止其他线程调用另一个方法,除非该方法也在同一监视器上同步。

0

在您的两个问题的答案是No:线程B将无法在方法someMethod2因为这种方法不同步锁定。 只有当两个线程都会调用someMethod时,同步和相关锁定才会起作用。

在这种情况下唯一的区别是将被锁定的目标。同步方法使用方法接收器作为锁(即对非静态方法使用this,对静态方法使用封闭类)

+0

同步不会阻止调用未同步的方法。 – shmosel

+0

谢谢,修改了答案。我没有正确理解这个问题 –

0

不,另一种方法可以在这些情况下自由锁定。当另一个线程锁定类的非静态方法时,线程可以获取静态方法的锁。这些方法有不同的监视器。

当一个静态方法被同步时,它在一个类上同步。这意味着执行静态方法时,整个类都被阻塞。所以其他静态同步方法也被阻塞。在其他情况下,当一个非静态方法被同步时,它将在一个实例上同步。只有这个特定对象的所有同步方法都被阻塞。

+0

但另一种方法不同步。 – shmosel