线程何时可以进入同步方法?

时间:2014-12-22 11:57:00

标签: java multithreading core

我有两个令我困惑的问题。我在java中不专业

Q1。两个线程A和B同时在对象中命中两个不同的同步方法。他们俩会继续吗? 以下哪个选项为上述问题提供了有效结果?

一个。是的,因为方法是同步的。

湾不,只有一种方法可以获得锁定。

℃。不,因为方法是同步的。

d。是的,两个不同的线程点击

Q2。在线程上不调用wait,notify和notifyAll方法,它们在Object上调用。是真还是假?

2 个答案:

答案 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(),但这通常不是一个明智的想法,因为库本身使用tt.wait()出于自身目的,图书馆使用这些方法可能会影响您的使用,反之亦然。

我能想到的问题的最佳答案是," t.notify()类实现wait()和notify(),以及当我们调用Objectfoo.wait()时我们几乎总是从Object类调用实现,因为对于任何类来覆盖这些方法都没有意义。

相关问题