【发布时间】: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