我有两个令我困惑的问题。我在java中不专业
Q1。两个线程A和B同时在对象中命中两个不同的同步方法。他们俩会继续吗? 以下哪个选项为上述问题提供了有效结果?
一个。是的,因为方法是同步的。
湾不,只有一种方法可以获得锁定。
℃。不,因为方法是同步的。
d。是的,两个不同的线程点击
Q2。在线程上不调用wait,notify和notifyAll方法,它们在Object上调用。是真还是假?
答案 0 :(得分:1)
B是C都是正确的 - 只有一个线程可以一次输入任何同步方法。即使同时调用不同的同步方法,这也适用。
关于第2部分,wait()
,notify()
和notifyAll()
是Object
类的实例方法,所以“true”是正确的 - 它们被调用(锁定) )对象。
答案 1 :(得分:1)
问题1有点模糊:最有可能的是,它询问同一个类的两个不同的实例方法,这两个方法都被声明为{{1} 在实例本身上,两个线程正在调用同一实例上的方法。如,
synchronized
我将如何解释这个问题,但是它的编写方式,会留下很多狡猾的空间。
所以,无论如何,假设我们有一个实例class Foobar {
synchronized SomeType methodA(...) { ... }
synchronized SomeOtherType methodB(...) { ... }
}
,并且线程A试图在线程B试图同时调用foo
"时尝试调用foo.methodA()
。 #34;
这将会发生什么:
两次调用都会成功,但它们将序列化。也就是说,methodA()调用将在methodB()调用开始之前完成,反之亦然。操作系统不允许两次调用重叠。没有更多信息,就无法确定哪个线程会先行。
无论哪个线程首先运行,另一个线程将阻塞,直到第一个线程完成其方法调用。 "阻止"当你在某个地方开车时,就像在等待红灯一样。你到了红灯,你停下来,直到它变绿,然后你继续前进。
在等待互斥锁时,我们通常不会想到或谈论线程被阻塞。在精心设计的计划中,除了在上班途中停下来之外,它并不是一件有趣的事情。唯一一次 变得有趣的时候,就是在灯光下或者在编程世界中,如果互斥锁是瓶颈 (即,它有太多争用)。
问题2更糟,因为foo.methodB()
是Thread
的子类。您可以在某个主题Object
上调用t.wait()
和t.notify()
,但这通常不是一个明智的想法,因为库本身使用t
和t.wait()
出于自身目的,图书馆使用这些方法可能会影响您的使用,反之亦然。
我能想到的问题的最佳答案是," t.notify()
类实现wait()和notify(),以及当我们调用Object
或foo.wait()
时我们几乎总是从Object类调用实现,因为对于任何类来覆盖这些方法都没有意义。