【问题标题】:In Java, can thread switching happen in the synchronized block?在Java中,线程切换可以发生在同步块中吗?
【发布时间】:2013-11-23 13:46:26
【问题描述】:

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

谢谢!

【问题讨论】:

  • 是的,上下文切换可能会发生,因为它是由操作系统而不是 JVM 处理的

标签: java multithreading


【解决方案1】:

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

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

【讨论】:

  • 有道理,完美!!
【解决方案2】:

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

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

【讨论】:

  • 我对同步块外线程阻塞的理解是正确的,也许你对我的问题的理解是不正确的。感谢您对上下文切换的回答,这是有道理的。
  • 我只能通过您发布的内容来判断您的理解。而且您发布了我知道同步块或方法将阻塞所有线程,直到里面的线程“离开”,这显然不是同步的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    认为线程切换和同步是两件完全不同的事情。同步只是关心资源的共享而不是更多而不是更少。另一个线程可以做一些完全不同的事情。所以两者没有关系。

    【讨论】:

      【解决方案5】:

      您使用同步块的主要原因实际上是操作系统完成的上下文切换!如果没有上下文切换,也不需要同步块。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 2014-07-04
        相关资源
        最近更新 更多