Java实例锁和实例字段锁的区别

Java instance lock and instance field lock difference

在下面的代码中,其中一个线程在没有任何干扰的情况下执行 A(),但之后发生了干扰。如果一个线程已经获得了对象的锁,它不应该也获得了字段的锁吗?

Integer i=0;
  
synchronized A(){
    for(i=10;i>0;i--);
}
 
B(){
    synchronized(this.i){       // if i replace this.i with this it works as expected.
        for(i=10;i>0;i--);
    }
}

"Shouldn't if a thread has acquired lock on the object, it would have have acquired locks on the fields as well?"

简短回答:否。synchronized-关键字仅同步对特定对象监视器的访问(在方法修饰符的情况下显式给定或隐式)。它不获取其他对象上的任何其他锁,也不关心给定对象的字段值。

另请参阅官方 Oracle 教程中的 "Intrinsic Locks and Synchronization"