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

2024-03-25

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在第1段时,线程2调用Clstest.testStaticMethod("arg-2").

那么线程1会发生什么呢?会进入睡眠状态吗?

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

当有一个时它是如何发生的Clstest.testStaticMethod和一样Clstest.testStaticMethod在所有五个线程之间共享?

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


汉斯·帕桑特的回答很好。但我想我会尝试以稍微简单的方式向遇到此问题并且对 Java 不熟悉的人进行解释。开始..

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

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

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

请注意,休眠是线程对其自身执行的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中多线程环境下的静态方法行为 的相关文章

随机推荐