我理解同步的块或方法会阻塞所有线程,直到内部的一个“离开”。我想知道,当线程在同步块内执行时,是否可以发生上下文切换?在我的理解中,它不应该。
谢谢!
答案 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是真的,但不是任何现代操作系统!