在多核处理器环境中,可以有多个线程在相同的给定时间运行相同的静态方法

时间:2016-09-13 08:26:07

标签: java multithreading cpu multicore

我读过这个问题 Static method behavior in multi-threaded environment in java
但是这个问题没有回答,可以在多核处理器环境中的相同的给定时间多线程运行相同的方法
如果我的标题问题是"是",我的计算机究竟是如何实现的呢?因为只有一个静态方法等待调用 两个核心分别将静态方法复制到它们的核心ram并分别同时运行它们吗? 我不知道我是否清楚地表达了我的观点。如果没有,我非常愿意解释它。谢谢。

3 个答案:

答案 0 :(得分:8)

独立执行一段代码所需的所有信息都存储在线程中。当核心执行一个方法时,它会在一个线程的上下文中执行。由于实际的可执行代码(指令)无法更改(不可写),因此无需将其复制到任何地方:它只能在线程/核心之间共享。

方法可以有局部变量。它们存储在堆栈中,这是线程的属性。每个线程的堆栈都有一个单独的内存,因此每个内核将访问不同的内存以获取局部变量。

对于堆上的数据,这是共享的,这就是为什么在通过协调访问(例如,使用synchronized)在多线程环境中访问它时必须小心的原因。 p>

静态或非静态不相关。在任何一种情况下,只有一个代码副本。非静态方法可以有多个对象实例(因此可能不同的内核将访问不同的堆数据,但不一定),静态方法访问静态数据(共享,你必须协调)

核心可以将可执行代码复制到本地缓存以供执行,但这是出于性能原因而不是因为可共享性的任何问题而完成的。

快速回答:是的。

答案 1 :(得分:1)

如果您在单个进程中讨论多线程,那么两个线程将基于线程优先级运行静态方法。但是,如果您正在谈论多处理器多线程环境,那么在相同的给定时间相同的静态或非静态方法可以在多核处理器环境中运行。因为每个进程都会运行到不同的JVM环境中。

答案 2 :(得分:1)

简短回答,是的,这是可能的。

每个方法调用都将获得自己的堆栈,并且可以并行运行。

要调用的静态方法只是一组可执行语句。由于不允许线程写入方法逻辑,因此每个线程引用同一组指令。它还有一个指针(类型),它指示它从指令执行的行。

从类/对象的角度考虑它。同一类的所有对象共享相同的代码库,但这是否意味着无法同时创建2个对象?

实例引用同一个对象,但与另一个实例不同。

同样,2个方法调用引用同一组指令,但数据不同(它们所处的指令,局部变量的值是什么等)。

我认为您的困惑是因为该方法是静态的(因此您的假设只有一个副本)。副本保持不变,并不意味着每次调用方法时,都必须复制指令。区分指令和数据,这将有所帮助。