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

java多线程环境中的静态方法行为,java,multithreading,static-methods,Java,Multithreading,Static Methods,有一个简单而愚蠢的问题困扰着我,在我的脑海里引发了好几个争论。 我想抛开所有关于以下问题的疑问 class Clstest{ public static String testStaticMethod(String inFileStr) { // section 0 // section 1 // do something with inFileStr // section 2 // sectio

有一个简单而愚蠢的问题困扰着我,在我的脑海里引发了好几个争论。 我想抛开所有关于以下问题的疑问

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
时,会发生什么情况

是否有可能交换多线程发送的
infiestr

它会进入睡眠状态吗

不,运行线程不会影响其他线程,只要它们不是有意地相互同步。如果您有多个处理器核心,所有最近的机器都有,那么这些线程可能会在同一时间执行。当您启动5个线程时,这种情况就不太可能发生,因为您的机器可能没有足够的内核。操作系统被迫在它们之间进行选择,给它们各自一些运行时间。线程调度程序的作业。线程将不会处于“睡眠”状态,它只是暂停并等待线程调度程序给它一个运行的机会。它将在被调度程序中断的位置恢复

是否有可能交换多个线程发送的inFileStr

不存在这种可能性,线程有自己的堆栈,因此每个线程的任何方法参数和局部变量都是唯一的。使用字符串还可以保证这些线程不会相互干扰,因为字符串是不可变的


如果参数是对另一种可变对象的引用,则没有这样的保证。或者如果方法本身使用静态变量或对堆上对象的引用。当一个线程修改对象而另一个线程读取该对象时,需要同步。C#语言中的lock关键字是实现这种所需同步的样板方法。该方法是静态的这一事实并不意味着永远不需要这种同步。不太可能,因为您不必担心线程访问同一对象(共享此对象)。

Hans Passant的答案很好。但我想我会尝试用一个稍微简单一点的方式向任何一个对Java不熟悉的人解释。这是

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

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

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


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

您的目标语言是什么?@OmegaMan:它是javaOops,从未见过[java]标记。够近了。我在贴的时候忘了加上了。我的坏习惯。无论如何,谢谢你的回答。这非常有用。所以,在多核处理器环境中,可能有多个线程同时运行相同的代码,不是吗?在单处理器环境中,在给定的时间只有一个线程在运行。(多个线程在它们之间共享时间。)那么,当线程调度程序给出从当前执行线程(A)到线程(B)的机会时,线程(A)如何从暂停的位置恢复?我的意思是它怎么知道恢复点?是不是因为“每个线程都有一个指向代码的指针,指向他们当前正在运行的代码位?”正如你所说的那样?你明白了。首先,线程的调度方式超出了Java的控制范围。我在这里说的是Sun的热点JVM。JVM将Java线程映射到OS线程,OS决定运行哪个线程。正如您所说,在单核机器上,操作系统一次只能运行一个,但在多核机器上,它可能一次运行多个。其次,线程并不真正知道何时暂停,它唯一的信息是程序指针(指向代码的指针)和堆栈,它们完全按照原来的方式保存和还原。因此,线程使用超出其局部范围的变量时会发生线程间干扰,例如,一个线程更新变量的值,然后另一个线程在自己的堆栈上提取该变量(或指向该变量的指针)?这是正确的理解吗?更确切地说。。。干涉只能发生,也可能发生,但不一定会发生。。。当线程共享堆上的内容时(非本地)。有几个