在Java中,可以在synchronized块中进行线程切换吗?

时间:2013-11-23 13:46:27

标签: java multithreading

我理解同步的块或方法会阻塞所有线程,直到内部的一个“离开”。我想知道,当线程在同步块内执行时,是否可以发生上下文切换?在我的理解中,它不应该。

谢谢!

5 个答案:

答案 0 :(得分:11)

  

当线程在同步块内执行时,是否会发生上下文切换?

是的,上下文切换也可以在synchronized块内发生。唯一不同的是,没有其他线程能够在同一个对象上输入相同的synchronized块(或任何其他块synchronized),直到上下文切换回移除线程,让它以受保护的代码完成。

答案 1 :(得分:4)

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

当然,在synchronized块中可能会发生上下文切换,因为其他线程也必须有一些时间来执行它们。如果不是这种情况,运行几秒钟的两个同步块将阻止2核机器上的所有其他块。你真的不希望这种情况发生。

答案 2 :(得分:1)

上下文切换可以在synchronized内进行。例如,我们可以在sleep()块中调用wait()synchronized方法。 sleep()wait()使当前线程无法运行。

答案 3 :(得分:0)

认为线程切换和同步是两个完全不同的东西。同步只需要关注资源的共享,而不是更少。另一个线程可以完成不同的事情。所以两者都不相关。

答案 4 :(得分:-2)

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

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