有打扰我,在我脑海中做出几个参数的简单愚蠢的问题。 我想扔掉所有关于以下问题的疑虑。
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中分裂为两种 - 堆和堆栈。 堆是所有对象生活和堆栈是在线程做他们的工作。 每个线程都有自己的堆栈,不能相互访问堆栈。 每个线程也有一个指针,其中指出,他们目前正在运行的代码位代码。
当一个线程开始运行的新方法,它保存的参数和局部变量在其自己的堆栈方法。 一些值可能是指向堆中的对象。 如果两个线程运行在相同的时间相同的方法,他们将都有自己的代码指针在该法指出,有自己对他们的筹码参数和局部变量的副本。 他们只会互相干扰,如果其堆栈的东西指向堆上的同一个对象。 在这种情况下,各种东西可能发生。 但正如汉斯指出,字符串是不可变的(不能改变),所以我们很安全,如果这是被“共享”的唯一对象。
这么多的线程可以运行相同的方法。 他们可能不会在同一时间运行 - 这取决于你有多少个核有你的机器为JVM映射Java线程到操作系统的线程,被调度到硬件线程上。 因此,你有超过这些线程交错,而无需使用复杂的同步机制的方式几乎无法控制。
请注意,睡眠是一个东西线程执行到自身。
它会去睡觉状态?
不,运行的线程不只要他们不故意相互同步影响到其他线程。 如果你有一个以上的处理器核心,所有最近的机器做,这些线程可能在完全相同的时间执行。 这得是有点不太可能,当您启动5个线程,因为你的机器可能没有足够的核心。 该操作系统是迫使他们之间的选择,让他们每一段时间的运行。 线程调度器的工作。 那么线程不会在“休眠”状态,它只是暂停,等待的线程调度给它一个机会运行。 这将恢复它是由调度中断。
是否有可能互换由多个线程发送的inFileStr?
有没有这样的可能性,线程有自己的堆栈,因此任何方法参数和局部变量将是为每个线程是唯一的。 使用字符串还保证这些线程不能互相干扰,因为字符串是不可变的。
有没有这样的保证,如果该参数是另一种可变对象的引用。 或者,如果该方法本身使用是静态变量或引用在堆上对象。 当一个线程修改对象,而另一个线程读取它需要同步。 在C#语言lock关键字是实现这样的要求的同步样板方式。 事实上,该方法是静态的 ,并不意味着这种同步是从来没有要求。 只是不太可能,因为你不必担心访问同一个对象(共享此 )线程。