【问题标题】:sleep() and context switching in java threadsjava线程中的sleep()和上下文切换
【发布时间】:2020-09-01 04:01:12
【问题描述】:

让我们假设这样的情况:

假设Thread0 先访问lockObject,然后Thread0 休眠1000 毫秒。

synchronized(lockObject) {
    Thread0.sleep(1000);
}

Thread1 也在等待访问lockObject

在这种情况下发生了什么? 上下文切换是否会因为 sleep(1000) 而暂停 1000 毫秒?

【问题讨论】:

  • 如果代码在 1000 毫秒内执行其他操作,您希望这会发生什么?为什么它会为sleep() 做其他事情?
  • 很少只有你的两个线程的上下文切换。操作系统可能会继续在线程之间切换,但不会在这两个线程之间切换。
  • Re,“在这种情况下发生了什么?”我们重写了应用程序,使它在持有锁时不会sleep()!我们应该从一开始就设计程序,使它永远不会保持任何锁的锁定时间超过一毫秒。也许甚至没有。
  • P.S.,你能解释一下,“上下文切换=3ms”是什么意思吗? “上下文切换将暂停”是什么意思?如果线程 0 在拥有锁的同时处于休眠状态,同时线程 1 正在等待获取相同的锁,那么这两个线程都不是 runnable,因此,这对任何一个线程都没有意义参与任何上下文切换。
  • @SolomonSlow 可以说没有任何 synchronized() 块和 wait() 方法。那么两个线程会因为上下文切换而一一访问共享对象 ryt?ex - 线程 1 访问共享对象,直到上下文切换 2ms 后挂起它,然后线程 0 访问共享对象 3ms ryt?如果我错了,请纠正我

标签: java multithreading synchronized java-threads thread-synchronization


【解决方案1】:

当您调用Thread0.sleep(1000); 时,线程不会释放lockObject 上的锁。所以是的,上下文切换将暂停 1000 毫秒。

【讨论】:

  • 谢谢先生?
猜你喜欢
  • 2017-09-09
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2018-04-18
  • 2014-12-05
相关资源
最近更新 更多