线程调度与同步
Thread scheduling and synchronization
线程调度程序是否可以取消调度持有锁到 synchronized 块并且正在执行它的线程?如果是,那么取消调度是否会导致线程释放锁?假设线程不调用 wait/yield
等方法
我一直在尝试了解同步块如何帮助 读取-更新-写入 操作?如果进入同步块的线程不能被取消调度那么它更容易理解但是如果它可以那么可见性问题就来了因为它可能是变量已经更新但没有被线程写入主内存的情况和线程调度程序取消调度它,其他线程获得锁并更新主内存中的变量。
有资料吗。在 JLS 中也是如此吗?
Is it possible for the thread scheduler to unschedule a thread holding [a lock]?
是的,这在许多 scheduling algorithms 中可能会先发制人。如果线程进行阻塞系统调用(例如,等待输入),它必须发生。
If yes then does the unscheduling leads to thread releasing the lock?
绝对不会!那会破坏锁定的目的,并且会破坏大多数多线程程序。
要点:让你的关键部分尽可能短!当线程 A 被阻塞执行长时间计算(或更糟,等待输入)时,不要让线程 B、C、D 和 E 都阻塞等待线程 A 释放一些锁。
线程调度程序是否可以取消调度持有锁到 synchronized 块并且正在执行它的线程?如果是,那么取消调度是否会导致线程释放锁?假设线程不调用 wait/yield
等方法
我一直在尝试了解同步块如何帮助 读取-更新-写入 操作?如果进入同步块的线程不能被取消调度那么它更容易理解但是如果它可以那么可见性问题就来了因为它可能是变量已经更新但没有被线程写入主内存的情况和线程调度程序取消调度它,其他线程获得锁并更新主内存中的变量。 有资料吗。在 JLS 中也是如此吗?
Is it possible for the thread scheduler to unschedule a thread holding [a lock]?
是的,这在许多 scheduling algorithms 中可能会先发制人。如果线程进行阻塞系统调用(例如,等待输入),它必须发生。
If yes then does the unscheduling leads to thread releasing the lock?
绝对不会!那会破坏锁定的目的,并且会破坏大多数多线程程序。
要点:让你的关键部分尽可能短!当线程 A 被阻塞执行长时间计算(或更糟,等待输入)时,不要让线程 B、C、D 和 E 都阻塞等待线程 A 释放一些锁。