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

Ume*_*cha 6 java

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

例如

class Test
{

      public static void m2()
      {


      }

      public synchronized void m1()
      {

            Test.m2();
             ----
            ----
      }  
Run Code Online (Sandbox Code Playgroud)

在上面的情况下,我是否需要使m2同步以避免竞争条件或我应该保持原样.

}

Jon*_*eet 8

这取决于你的静态方法在做什么.你真的需要它同步吗?它是否访问共享可变状态?

如果是的话,你可能需要同步(虽然我不只是用做synchronized修改-我想创建一个私有静态final变量与对象锁定).

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

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

  • 我对你的最后一段有一点疑问。改变可从静态引用的对象的代码需要是线程安全的,尽管通常不应该这样做。几乎所有静态方法都不应该改变静态变量,因此不需要是线程安全的。例如,您不会使“Collections.sort”成为线程安全的。 (2认同)