2013-11-23 31 views
5

我明白一个同步块或方法将阻止所有线程,直到里面的一个“离开”。我想知道,当线程在同步块内执行时,上下文切换是否会发生?根据我的理解,它不应该。在Java中,线程切换是否发生在同步块中?

谢谢!

+1

是的,可能发生的上下文切换,因为它是由OS而不是JVM –

回答

9

罐上下文切换发生?

是的,上下文切换也可以在​​块内发生。这将是唯一不同的是,没有其他线程将必须等到上下文切换回该捷足先登线程进入同一​​块(或同一对象上任何其他块​​),让它与完成其受保护代码。

+0

有道理,完美! – Abidi

3

你明白是错的。同步块不会阻塞其他线程。同步块仅阻止其他线程进入在同一对象上同步的块。其他线程在正在执行同步块的同时继续运行。

和当然,上下文切换可能发生,而在synchronized块,因为其他线程也必须有一定的时间来执行自己。如果情况并非如此,则运行几秒钟的两个同步块将阻塞2核机器上的其他所有内容。你真的不希望发生这种情况。当线程正在执行内同步块

+0

我的理解线程阻塞的处理外synchronized块是正确的,也许你的问题,我的理解是不正确的。感谢您关于上下文切换的答案,这是有道理的。 – Abidi

+0

我只能通过你发布的内容来判断你的理解。你发布*我理解一个同步块或方法将阻止所有线程,直到其中一个“左”*,这显然不是什么同步。 –

-2

您使用synchronized块主要的原因是,上下文切换的OS进行实际!如果没有上下文切换,则不需要同步块。

实际上没有上下文切换意味着没有线程支持!是的,关于MS-DOS是真的,但没有任何现代操作系统!

0

想到线程切换和同步是2完全不同的东西。同步只是关心共享资源,不能更少。另一个线程可以完成不同的事情。所以两者都没有关系。

1

上下文切换可以在里面​​发生。如我们可以在​​区块中调用sleep()wait()方法。 sleep()wait()使当前线程无法运行。