是否可以同时访问多个对象实例的类的静态方法?

时间:2010-05-30 13:29:07

标签: java

示例:

ThisClass.staticMethod(Object... parameters);

将由其他对象的多个实例同时访问。

当他们同时使用相同的静态方法时,是否会与其他对象有任何依赖关系?

4 个答案:

答案 0 :(得分:8)

仅当方法使用静态对象或参数由其他实例共享时。

示例:Math.max(int a,int b)是一个静态方法,但不使用任何静态对象,因此没有依赖项。

示例2:这里所有调用共享相同的结果变量,对staticMethod的两次并行调用可能导致错误的结果。

private static int result = 0;
private static int staticMethod(Object... args)
{
      result = args.length;
      //Do Something
      return result;
}

示例3:如果没有共享任何参数,则此线程是安全的,每次调用都有自己的结果实例。

private static int staticMethod(Object... args)
{
    int result = 0;
    result = args.length;
    //Do something
    return result;
}

示例4:这使用类作为锁来防止对类函数的并行访问。只有一次对staticMethod的调用会执行所有其他的等待

private static int result = 0;
private static synchronized int staticMethod(Object... args)
{
      result = args.length;
      //Do Something
      return result;
}

答案 1 :(得分:1)

显然,如果这是你的意思,该方法的所有用户都依赖于该类。

此外,如果他们真的同时调用该方法(即从多个线程),您可能会遇到并发问题,具体取决于方法实际执行的操作。向我们展示代码,我们可能会告诉您更多。

答案 2 :(得分:1)

多个线程并发运行的代码片段有可能导致race conditions,无论此代码放在何处(静态/非静态方法)。

您必须确保代码操纵的数据能够容忍并发访问,并在需要时正确同步代码。

答案 3 :(得分:1)

调用静态方法的所有对象都将依赖于类方法,但它们之间不会有依赖关系。如果静态方法可能被来自不同线程的对象调用,则需要确保静态方法是线程安全的,即,您需要使用锁定来确保一次只有一个线程访问任何非线程 - 记忆。