线程调度程序是否可能将持有锁的线程取消调度到 synchronized 块,并且正在执行该线程?如果是,那么非调度导致线程释放锁吗?假设线程没有调用诸如wait/yield
等的方法。
我一直在尝试了解同步块如何在 read-update-write 操作中提供帮助?如果进入同步块的线程不能被调度,那么它更容易理解,但是如果可以,那么可见性问题就来了,因为变量可能已经被更新但没有被线程和主线程写入主存储器。线程调度程序取消调度它,其他线程获得锁并更新主内存中的变量。 是否有任何信息。在JLS中是否也一样?
答案 0 :(得分:3)
线程调度程序是否可以对持有[锁]的线程取消调度?
是的,这可以在许多scheduling algorithms中抢先发生。如果线程进行了阻塞的系统调用(例如,等待输入),则必须发生。
如果是,那么非调度导致线程释放锁吗?
绝对不是!那会破坏锁定的目的,并且会破坏大多数多线程程序。
注意事项:关键部分要尽可能短!当线程A被阻塞执行长时间计算(或更糟糕的是,等待输入)时,不要让线程B,C,D和E都被阻塞,等待线程A释放一些锁。