Java 同步方法有自己的锁吗?

Java 同步方法有自己的锁吗?,java,multithreading,concurrency,locking,Java,Multithreading,Concurrency,Locking,如果我有 class myClass { synchronized methodA { }; synchronized methodB { }; } 这是否意味着有两个隐式锁?一个是方法A,一个是方法B?我正在阅读Gayle McDowell的编码访谈,她说锁定发生在方法+对象的层次,而不是对象。我的印象是myClass只有一个锁,每个同步方法都使用这个锁。有人能解释一下吗?这个 synchronized void methodA { //code } 相当于 vo

如果我有

class myClass {

    synchronized methodA { };

    synchronized methodB { };
}
这是否意味着有两个隐式锁?一个是方法A,一个是方法B?我正在阅读Gayle McDowell的编码访谈,她说锁定发生在方法+对象的层次,而不是对象。我的印象是myClass只有一个锁,每个同步方法都使用这个锁。有人能解释一下吗?

这个

synchronized void methodA 
{
  //code
}
相当于

void methodA 
{
  synchronized(this)
  {
    //code
  }

}
因此,方法前面的同步将使用对象本身的实例作为锁。

synchronized void methodA 
{
  //code
}
相当于

void methodA 
{
  synchronized(this)
  {
    //code
  }

}

因此,在一个方法前面的
synchronized
将使用对象本身的实例作为锁。

这两个方法使用相同的锁。 java中的每个对象都有其内部互斥体

synchronized void method() {}

用同一把锁

但如果您尝试在静态方法上同步-它将使用不同的锁:

static synchronized method() { // used Class lock ! not object lock
} 

这两种方法使用相同的锁。 java中的每个对象都有其内部互斥体

synchronized void method() {}

用同一把锁

但如果您尝试在静态方法上同步-它将使用不同的锁:

static synchronized method() { // used Class lock ! not object lock
} 

锁是在对象上获得的,而不是在方法上。锁是在对象上获得的,而不是在方法本身上获得的