Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 获取对象的监视器锁的线程是否也获取超类的对象锁?_Multithreading_Synchronization_Synchronized_Thread Synchronization - Fatal编程技术网

Multithreading 获取对象的监视器锁的线程是否也获取超类的对象锁?

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对象锁的线程也拥有对象的锁,它是超类 已

当一个线程获取一个对象(比如B类)的监控锁时,它是否获取了属于它的超类(比如a类,B扩展了a类)的对象的监控锁

观察#1-当一个线程(通过同步方法拥有派生对象B的监视器锁)调用超类a中的wait()时,第二个线程获取对象B的监视器锁并在a中等待。最后,两个线程同时退出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) {
}