【问题标题】:When can threads enter synchronised methods? [closed]线程什么时候可以进入同步方法? [关闭]
【发布时间】:2015-02-20 12:39:14
【问题描述】:

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

第一季度。两个线程 A 和 B 同时命中一个对象中的两个不同的同步方法。他们俩会继续吗? 以下哪个选项给出了上述问题的有效结果?

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

b.不,只有一种方法可以获取锁。

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

d。是的,两个不同的线程命中

第二季度。 wait、notify 和 notifyAll 方法不在 Thread 上调用,而是在 Object 上调用。是真是假?

【问题讨论】:

  • 也许您可以解释您的疑问,这将导致更明智的答案。我建议你阅读 Object 的 Javadoc,它会解释第二个答案。

标签: java multithreading core


【解决方案1】:

问题 1 有点模糊: 很可能,它询问的是同一类的两个不同的实例方法,这两个方法都声明为synchronized 实例本身,两个线程正在调用同一个实例上的方法。例如,

class Foobar {
    synchronized SomeType methodA(...) { ... }
    synchronized SomeOtherType methodB(...) { ... }
}

我会这样解释这个问题,但它的写作方式留下了很多狡猾的空间。

无论如何,假设我们有一个实例foo,线程 A 尝试调用foo.methodA(),而线程 B 尝试“同时”调用foo.methodB()。

接下来会发生什么:

两个调用都会成功,但它们将被序列化。也就是说,methodA() 调用将在 methodB() 调用开始之前完成,反之亦然。操作系统不允许这两个调用重叠。如果没有更多信息,就无法判断哪个线程会先走。

无论哪个线程首先运行,另一个线程将被阻塞,直到第一个线程完成其方法调用。 “阻塞”就像你在某个地方开车时等红灯一样。你到了红灯,你停下来,直到它变成绿灯,然后你继续上路。

我们通常不会想到或谈论线程在等待互斥体时被阻塞。在一个精心设计的程序中,没有比上班路上遇到红灯更有趣的了。它确实变得有趣的唯一时候是当信号灯出现巨大的可怕交通拥堵时,或者在编程世界中,如果互斥锁是瓶颈(即,它有太多的争用)。

问题 2 更糟,因为Thread 是Object 的子类。您可以在某个线程t 上调用t.wait() 和t.notify(),但这通常不是一个聪明的想法,因为库本身使用t.wait() 和t.notify() 来实现自己的目的,并且这些方法的库使用可能会干扰您的使用,反之亦然。

对于这个问题,我能想到的最佳答案是,“Object 类实现了 wait() 和 notify(),当我们调用 foo.wait() 或 foo.notify() 时,我们几乎总是从对象类,因为任何类重写这些方法都没有意义。

【讨论】:

  • 感谢分配解释...
【解决方案2】:

B 和 C 都是正确的——只有一个线程可以同时进入任何同步方法。即使同时调用不同的同步方法,这也适用。

关于第 2 部分,wait()、notify() 和 notifyAll() 是 Object 类的实例方法,因此“true”是正确的 - 它们是在(锁定)对象上调用的。

【讨论】:

  • 这里他们说一个对象中有两个不同的同步函数。仍然只有一个线程可以访问?
  • 是的——只有一个线程,即使方法不同。我已经澄清了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 2012-12-24
相关资源
最近更新 更多