java中multithreading环境中的静态方法行为

有一个简单的愚蠢的问题,困扰着我,并在我的脑海里提出了几个论点。 我想抛出所有关于下面的问题的怀疑。

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

Hans Passant的回答很好。 但是我想我会试着在一个稍微简单的层面上为任何遇到这个问题的人解释一下,对Java来说是新鲜的。 开始..

Java中的内存分为两种 – 堆和堆栈。 堆是所有对象生活的地方,堆栈是线程完成工作的地方。 每个线程都有自己的堆栈,不能访问其他堆栈。 每个线程还有一个指向代码的指针,指向他们当前正在运行的代码位。

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

所以很multithreading可以运行相同的方法。 它们可能不会同时运行 – 这取决于您的计算机上有多less个核心,因为JVM将Java线程映射到调度到硬件线程上的OS线程。 因此,您无法控制这些线程交错的方式,而不使用复杂的同步机制。

请注意,睡眠是一个线程自身的事情。

它会进入睡眠状态吗?

不,运行线程不会影响其他线程,只要它们不会有意地彼此同步。 如果你有多个处理器核心,所有最新的机器都可以,那么这些线程可能同时执行。 由于您的计算机可能没有足够的内核,因此启动5个线程时可能性会降低。 操作系统被迫在它们之间进行select,给它们每一段时间运行。 线程调度器的工作。 一个线程不会处于“睡眠”状态,它只是暂停,并等待线程调度程序给它一个运行的机会。 它会在调度程序中断的地方恢复。

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

没有这种可能性,线程有自己的堆栈,所以任何方法参数和局部variables对于每个线程都是唯一的。 此外使用string保证了这些线程不能相互干扰,因为string是不可变的。

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