【问题标题】:Synchronized method x call another y, y has to be also synchronized?同步方法 x 调用另一个 y,y 也必须同步?
【发布时间】:2014-01-29 09:47:08
【问题描述】:

我有一个方法

public synchronized x() { 
    y();
}

private y() { }

y() 仅由 x() 调用。所以我的问题是 y() 也必须是一个同步方法?还是只是隐含的?

【问题讨论】:

标签: java synchronized


【解决方案1】:

如果您确定 y 仅由 x 调用,则无需同步 y。这相当于将y 的代码直接放入x

【讨论】:

  • 这是我的第一感觉,但我敢肯定。感谢您的快速回复。
【解决方案2】:

如果仅从 x() 函数调用 y(),则无需再次使 y 同步。但是请注意, y() 不应该是静态的。在 x() 和 y() 都是实例方法或两者都是静态方法之前,您的解决方案会一直保持良好状态。

【讨论】:

    【解决方案3】:

    您可能想熟悉监视器的概念。在您的情况下,x() 的访问线程将拥有该对象的监视器。任何其他也想拥有该监视器的线程都被阻止。 IE。另一个线程可以调用y(),因为它不同步,如果另一个线程想要获得该监视器的所有权(例如调用x()),则它会被阻塞。当线程从x()返回时,监视器将被隐式释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-20
      • 2011-08-13
      • 2017-10-23
      • 2020-02-23
      • 2017-05-30
      • 2021-06-05
      • 2019-08-20
      • 1970-01-01
      相关资源
      最近更新 更多