java - java中多线程环境中的静态方法行为

标签 java multithreading static-methods

class Clstest{

    public static String testStaticMethod(String inFileStr) {
        
        // section 0
        
        // section 1
        
        // do something with inFileStr
        
        // section 2
        
        // section 3
        
        return inFileStr;

    }

}

假设有五个线程同时执行对 Clstest.testStaticMethod("arg-n") 的调用。

线程 1 调用 Clstest.testStaticMethod("arg-1")

当线程1在section 1时,线程2调用Clstest.testStaticMethod("arg-2")

那么线程 1 会发生什么?会进入 hibernate 状态吗?

当线程 1 有机会时,它会从暂停的第 1 节恢复执行吗?

当有一个 Clstest.testStaticMethod 并且相同的 Clstest.testStaticMethod 在所有五个线程之间共享时会发生什么?

多线程发送的inFileStr有没有可能互换?

最佳答案

Hans Passant 的回答很好。但我想我会尝试用稍微简单一点的方式向任何遇到这个问题并且对 Java 不熟悉的人解释一下。来了..

java中的内存分为两种——堆和栈。堆是所有对象所在的地方,堆栈是线程工作的地方。每个线程都有自己的堆栈,并且不能访问彼此的堆栈。每个线程还有一个指向代码的指针,该指针指向它们当前正在运行的代码。

当一个线程开始运行一个新方法时,它会将该方法中的参数和局部变量保存在自己的堆栈中。其中一些值可能是指向堆上对象的指针。如果两个线程同时运行相同的方法,它们的代码指针都将指向该方法,并且它们的堆栈上都有自己的参数和局部变量副本。只有当它们堆栈上的东西指向堆上的相同对象时,它们才会相互干扰。在这种情况下,各种事情都可能发生。但正如 Hans 所指出的,字符串是不可变的(无法更改),所以如果这是唯一被“共享”的对象,我们是安全的。

这么多线程可以运行相同的方法。它们可能不会同时运行 - 这取决于您的机器上有多少内核,因为 JVM 将 Java 线程映射到 OS 线程,这些线程被调度到硬件线程上。因此,如果不使用复杂的同步机制,您几乎无法控制这些线程的交错方式。

请注意, sleep 是线程对自身所做的事情。

关于java - java中多线程环境中的静态方法行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17343157/

相关文章:

javascript - JSDoc:如何提示 this.constructor.staticSomething?

java - 避免公式注入(inject),保留单元格值(HSSF/*.xls 中的引号前缀)

java - 为什么当我切换到横向时,对用户界面的更改会被撤消?

java - 如何理解使用 "return this"时返回的方法

java - 使调度方法线程安全

静态方法的Java实例变量

java - 在Java中检测字符串中重复字符的最有效方法是什么?

java - 使用静态对象的第二个非静态引用时出现 NullPointer 异常

java - 如何保持线程执行直到异步线程返回回调

inheritance - 如何正确代理 "inherited"静态方法?