同步方法x调用另一个y,y还必须同步吗?

时间:2014-01-10 12:08:03

标签: java synchronized

我有一个方法

public synchronized x() { 
    y();
}

private y() { }

y()仅由x()调用。所以我的问题是y()必须也是一个同步方法?或者只是暗示?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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