【发布时间】:2013-11-23 13:46:26
【问题描述】:
我知道同步块或方法会阻塞所有线程,直到里面的线程“离开”。我想知道,当线程在同步块内执行时会发生上下文切换吗?以我的理解,它不应该。
谢谢!
【问题讨论】:
-
是的,上下文切换可能会发生,因为它是由操作系统而不是 JVM 处理的
标签: java multithreading
我知道同步块或方法会阻塞所有线程,直到里面的线程“离开”。我想知道,当线程在同步块内执行时会发生上下文切换吗?以我的理解,它不应该。
谢谢!
【问题讨论】:
标签: java multithreading
线程在同步块内执行时是否会发生上下文切换?
是的,上下文切换也可以发生在 synchronized 块内。唯一不同的是,没有其他线程能够进入相同的 synchronized 块(或同一对象上的任何其他块 synchronized),直到上下文切换回该预占线程,让它以受保护的代码结束。
【讨论】:
你的理解是错误的。同步块不会阻塞其他线程。同步块仅防止其他线程进入在同一对象上同步的块。其他线程在执行同步块时继续运行。
当然,上下文切换可以在同步块中发生,因为其他线程也必须有一些时间来执行它们自己。如果不是这样,运行几秒钟的两个同步块将阻塞 2 核机器上的所有其他内容。你真的不希望这种情况发生。
【讨论】:
上下文切换可以发生在synchronized 内。比如我们可以在synchronized块中调用sleep()或wait()方法。 sleep() 或 wait() 使当前线程无法运行。
【讨论】:
认为线程切换和同步是两件完全不同的事情。同步只是关心资源的共享而不是更多而不是更少。另一个线程可以做一些完全不同的事情。所以两者没有关系。
【讨论】:
您使用同步块的主要原因实际上是操作系统完成的上下文切换!如果没有上下文切换,也不需要同步块。
实际上没有上下文切换意味着没有线程支持!是的,MS-DOS 确实如此,但任何现代操作系统都不是!
【讨论】: