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"。
在下面的代码中,其中一个线程在没有任何干扰的情况下执行 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"。