示例:
ThisClass.staticMethod(Object... parameters);
将由其他对象的多个实例同时访问。
当他们同时使用相同的静态方法时,是否会与其他对象有任何依赖关系?
答案 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)
调用静态方法的所有对象都将依赖于类方法,但它们之间不会有依赖关系。如果静态方法可能被来自不同线程的对象调用,则需要确保静态方法是线程安全的,即,您需要使用锁定来确保一次只有一个线程访问任何非线程 - 记忆。