Static method behavior in multi-threaded environment in java

class Clstest{


public static String testStaticMethod(String inFileStr) {
        

// section 0
        

// section 1
        

// do something with inFileStr
        

// section 2
        

// section 3
        

return inFileStr;


}


}

Let's assume there are five threads are each executing a call to Clstest.testStaticMethod("arg-n") at the same time.

Thread 1 calls Clstest.testStaticMethod("arg-1").

When thread 1 is in the section 1, thread 2 calls Clstest.testStaticMethod("arg-2").

Then what will happen to Thread 1? Will it go to sleep state?

When Thread 1 got the chance will it resume the execution from section 1 where it was paused?

How it happens when there's one Clstest.testStaticMethod and same Clstest.testStaticMethod is shared between all five threads?

Is there any possibility to interchange the inFileStr sent by multiple threads?

59638 次浏览

会进入睡眠状态吗?

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

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

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

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

Hans Passant's answer is good. But I thought I would try and explain at a slightly more simple level for anybody who comes across this and is newish to Java. Here goes..

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

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

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

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