静态和非静态方法上的Java同步

时间:2017-08-09 21:10:49

标签: java multithreading synchronization

我对同步行为(静态和非静态方法)感到困惑。

例如:

1

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

  ...
}

因此,如果线程A调用someMethod1(),线程B是否锁定someMethod2()?

2

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

  ...
}

如果我们有MyClass a = new MyClass(),线程A调用方法someMethod(),线程是否锁定someMethod2()?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

在您的两个问题中,答案是No:线程B不会被锁定在方法someMethod2上,因为此方法未同步。 仅当两个线程都将调用someMethod时,同步和相关锁才会起作用。

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

答案 2 :(得分:0)

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

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