如果在同步非静态方法中调用静态方法,我们是否需要将其作为同步?

时间:2010-12-09 07:22:11

标签: java

如果在同步非静态方法中调用静态方法,我们是否需要将静态方法设为同步?

例如。

class Test
{

      public static void m2()
      {


      }

      public synchronized void m1()
      {

            Test.m2();
             ----
            ----
      }  

在上述情况下,我是否需要将m2设为同步以避免竞争状况,或者我应该保持原样。

}

3 个答案:

答案 0 :(得分:8)

这取决于静态方法的作用。你真的需要它同步吗?它是否访问共享可变状态?

如果是这样,你可能需要同步(虽然我不会只使用synchronized修饰符 - 我创建一个私有静态最终变量,其对象为锁定。)

您的实例方法已同步这一事实意味着没有两个线程将使用相同的目标对象执行 - 但是两个线程都可以执行m1不同目标对象,因此m2可以同时调用两次。这是否是一个问题取决于它在做什么。如果它没有使用任何共享状态(例如,它实际上只是基于其参数计算某些东西),那么它根本不需要同步。

一般来说,静态方法比实例方法更可靠线程安全:我通常使类型本身是线程安全的,而是尝试使用几个类来管理并发,每个线程尽可能使用自己的一组独立对象。

答案 1 :(得分:2)

您需要同步m2。否则有人可以同时调用该方法。我假设m2被认为是同步的,否则这是一个没有实际意义的点。

答案 2 :(得分:0)

通常,同步static方法可能很有用。例如,在这种情况下:

private static final List<Object> GLOBAL_STATE = new ArrayList<Object>();

public static synchronized void add(Object foo) {
    GLOBAL_STATE.add(foo);
}

但是在你的情况下,你从另一个已经同步的方法调用该方法。所以你不必同步它。但在您的示例中,您使用static方法public。如果是这样的话,也可以synchronized