我很难理解以下情况: (我在java工作) 假设我们有一个对象o,两个不同的线程t1和t2以及两个CPU。 如果t1调用o.method1并且t2同时调用o.method2,cpu1可以同时运行o.method1和cpu2 o.method2吗?
答案 0 :(得分:4)
是的,可以。但是,没有任何保证您在 parallel 中实际执行了不同的线程。您只能保证它们同时执行 。
操作系统可以自由地将线程绑定到一个CPU(甚至可以切换线程的CPU)。 这是一直这样做的。
特别是,当其他应用程序运行CPU密集型计算时,您的两个线程可能共享同一个CPU。 在这种情况下,您的线程运行 interleaved 。
(在这个回答中,我所说的关于 CPU 的内容也适用于 CPU内核。)
当然,锁和同步可以使一个线程在另一个线程上等待。从技术上讲,这种等待可以解释为正在运行,尽管它不占用CPU时间。
另请注意,并行执行方法(通常)与调用方法的无关。在您的示例中,您在同一对象上调用两个不同的方法。但是,这完全无关紧要。
除了,如果这两个方法在Java中都标记为synchronized
,它会在此特定对象上引入同步(请参阅上面的段落)并使一个线程等到另一个已完成对该方法的调用。