当前位置: 首页 > 知识库问答 >
问题:

两个线程同时调用同一个静态方法会怎么样?

上官季
2023-03-14

当两个线程同时调用相同的静态方法时会发生什么?例如:

public static String someMethod(){

    //some logic, can take about 1 second to process

    return new String(result);
}

第一个线程现在调用someMethod()。第二个线程从现在起0.5秒后调用someMethod()(第一个线程仍在处理数据)。

我知道someMethod()可以同步。但如果它不同步,会发生什么呢?

共有3个答案

濮书
2023-03-14

该方法是静态的这一事实是无关紧要的。他们应该质疑所讨论的代码正在操纵哪些状态变量

  • 如果没有任何实例/类的成员被读取/写入,那么应该没有问题。
  • 在写操作的情况下,需要某种同步
  • 如果只有读取,这并不一定意味着该方法同步良好。这取决于数据是如何写入的以及由哪个线程写入。例如,如果代码读取V,在写入操作期间受到监视器M的保护,那么V的读取也必须在同一监视器上同步。
江子石
2023-03-14

这取决于你的方法是否在状态之外改变。

static long i = 0l;
public static String someMethod(){
    String accm = "";
    for(;i < Integer.MAX_VALUE*20/*Just to make sure word tearing occurs*/; i++)
        accm += i
    return accm;
}

会导致问题:

  • 不能保证以原子方式设置长,因此它们可能会被“撕裂”(规范)
  • 不是原子操作。它与{int n=i; i=i 1;返回n}完全相同
    • i=i 1也不是原子的,如果中途改变,会重复一些值
    • n的返回可能是陈旧的

    但是如果< code>i是一个局部变量,就不会有问题。只要任何外部状态在被读取时保证是不可变的,就不会有任何问题。

计弘
2023-03-14

调用方法时,JVM 会为执行线程中的调用创建一个堆栈帧。此帧包含在方法中声明的所有局部变量。对于任何不访问字段的方法(静态或其他方法),则每个执行在每个线程上完全独立地进行。如果该方法在其计算中使用参数,则这些参数也位于堆栈帧中,并且多个调用不会相互干扰。

 类似资料:
  • 问题内容: public class Deadlock { static class Friend { private final String name; public Friend(String name) { this.name = name; } public String getName() { return this.name; } public synchronized void b

  • 问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。

  • 我试图制作一个时钟,如果 如何同时运行警告语音和时钟,使时钟在播放警告语音()时不会停止? 语音代码: 时钟代码:

  • 在一次采访中,有人问我,关于多线程,假设在同一个对象上有两个线程(线程1和线程2)。Thread-1在synchronized method1()中,Thread-2能以任何方式在java中同时进入synchronized method2()吗? 我回答“不”。这里,当Thread-1处于synchronizedmethod1()时,它必须持有对象监视器上的锁,并且只有当它退出synchroniz

  • 问题内容: 我使用的不是可重入的库(用C编写)(即库中没有函数可重入)。假设我已经通过System.load加载了库以获取句柄“ v”。由于重入问题(尝试过但无意义的结果),我无法在两个线程中使用v。我可以使用锁,但这会破坏我本可以获得的任何并行性。 我想做的是启动两个线程,然后在每个线程中加载库以获取两个不同的句柄(因此,加载的库有两个副本)。 这在Java中可行吗?问候Saptarshi 问题