我有两个让我感到困惑的问题。我不是Java专业人士
Q1。两个线程A和B同时在一个对象中命中两个不同的同步方法。他们俩都会继续吗?以下哪个选项可为上述问题提供有效的结果?
一种。是的,因为这些方法是同步的。
b。不可以,只有一种方法可以获取锁。
C。否,因为这些方法是同步的。
d。是的,命中了两个不同的线程
Q2。wait,notify和notifyAll方法不是在Thread上调用的,它们是在Object上调用的。对或错?
问题1有点含糊:最有可能的是,它询问的是同一类的两个不同的实例方法,两个方法都声明为synchronized
在实例本身上,并且两个线程在同一实例上调用这些方法。例如,
class Foobar {
synchronized SomeType methodA(...) { ... }
synchronized SomeOtherType methodB(...) { ... }
}
这就是我要解释这个问题的方式,但是它的书写方式给它留下了很多的狡猾的余地。
因此,无论如何,假设我们有一个实例,foo
并且线程A尝试调用foo.methodA()
而线程B尝试foo.methodB()
“同时”调用。
将会发生以下情况:
这两个调用都将成功,但是将被序列化。也就是说,methodA()调用将在methodB()调用开始之前完成,反之亦然。操作系统将不允许两个调用重叠。没有更多信息,就无法判断哪个线程将首先进入。
无论哪个线程先运行,另一个线程将被阻塞,直到第一个线程完成其方法调用为止。“封锁”就像您在某个地方开车时等待红灯一样。您到达红灯,停下来直到变成绿色,然后继续前进。
我们通常不会考虑或谈论在等待互斥时线程被阻塞。在一个精心设计的程序中,没有什么比停止工作时的红灯有趣了。它唯一一次没有变得有趣的是,当有在光一个巨大的可怕的堵车,或者在编程世界里,如果互斥体是一个瓶颈(即,它有太多的竞争)。
问题2甚至更糟,因为它Thread
是的子类Object
。您可以在Thread上调用t.wait()
和,但这通常不是一个明智的主意,因为库本身使用并用于自己的目的,并且库对这些方法的使用可能会干扰您的使用,反之亦然。t.notify()
t
t.wait()
t.notify()
对于这个问题,我能想到的最佳答案是:“Object
该类实现了wait()和notify(),并且当我们调用foo.wait()
或foo.notify()
我们几乎总是从Object类中调用实现时,因为它对任何类都没有意义。覆盖这些方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句