Multithreading 获取对象的监视器锁的线程是否也获取超类的对象锁?
当一个线程获取一个对象(比如B类)的监控锁时,它是否获取了属于它的超类(比如a类,B扩展了a类)的对象的监控锁 观察#1-当一个线程(通过同步方法拥有派生对象B的监视器锁)调用超类a中的wait()时,第二个线程获取对象B的监视器锁并在a中等待。最后,两个线程同时退出B的对象监视器 我的理解是线程应该在其拥有锁的对象上调用Multithreading 获取对象的监视器锁的线程是否也获取超类的对象锁?,multithreading,synchronization,synchronized,thread-synchronization,Multithreading,Synchronization,Synchronized,Thread Synchronization,当一个线程获取一个对象(比如B类)的监控锁时,它是否获取了属于它的超类(比如a类,B扩展了a类)的对象的监控锁 观察#1-当一个线程(通过同步方法拥有派生对象B的监视器锁)调用超类a中的wait()时,第二个线程获取对象B的监视器锁并在a中等待。最后,两个线程同时退出B的对象监视器 我的理解是线程应该在其拥有锁的对象上调用wait(),否则这将导致非法MonitorStateException。在A的实例方法中调用wait()时没有异常,这是否意味着拥有B对象锁的线程也拥有对象的锁,它是超类 已
wait()
,否则这将导致非法MonitorStateException。在A的实例方法中调用wait()时没有异常,这是否意味着拥有B对象锁的线程也拥有对象的锁,它是超类
已检查有关同步和内部锁的文章-
观察#2-当线程(通过同步方法拥有对象a的监视器锁)调用任意类C中的wait()时,它会引发一个非法MonitorStateException
这表明线程在C的对象上调用wait(),而它拥有不同对象A的锁。因此有例外
为什么与任何其他类相比,超类的对象监视器锁的行为方式存在这种固有的差异
我对对象监视器锁的理解有什么遗漏吗?我不确定你的问题是否有意义。没有“超类”实例,因为子类的实例与其超类的实例相同,否则每次使用
new
关键字时都会实例化多个对象。这也是你不能做以下事情的原因:
synchronized (super) {
}
最终,使用wait
和notify[All]
的功能属于Object
(因为它们是最终方法),这是每个类的超级类。您可以将在上同步此
视为在属于对象
的监视器上同步,因为内部锁与对象关联,而不是与类关联(一个重要的区别是,可以获取与类
对象关联的内部锁)
因此,由于
A
和B
都是对象
的同一个实例,所以您是否在B
中同步并从A
调用等待
并不重要,它们都是指同一个对象
我不确定您的问题是否有意义。没有“超类”实例,因为子类的实例与其超类的实例相同,否则每次使用new
关键字时都会实例化多个对象。这也是你不能做以下事情的原因:
synchronized (super) {
}
最终,使用wait
和notify[All]
的功能属于Object
(因为它们是最终方法),这是每个类的超级类。您可以将在上同步此
视为在属于对象
的监视器上同步,因为内部锁与对象关联,而不是与类关联(一个重要的区别是,可以获取与类
对象关联的内部锁)
因此,由于
A
和B
都是对象
的同一个实例,因此在B
中同步并从A
调用wait
并不重要,它们都指向相同的对象
确定。这回答了我的问题。因此,对象锁指的是this
以及super
。在对象锁的意义上,两者都引用同一个实例。这回答了我的问题。因此,对象锁指的是this
以及super
。在对象锁的意义上,两者都指同一个实例。
synchronized (super) {
}