ReentrantLock 公平性参数
ReentrantLock fairness parameter
这个问题是理论性的,很抱歉,这次我不能回避。
我正在了解 ReentrantLock
和 read this:
Note however, that fairness of locks does not guarantee fairness of thread scheduling.
这是什么意思?我怎么能想象这个?
假设现在没有任何人持有锁:
- 线程调度器唤醒
t1
个线程(不是等待时间最长的线程)
t1
尝试获取锁
- 锁拒绝
t1
因为 t1
不是等待时间最长的线程
t1
睡觉
- 线程调度器唤醒一个线程
Java是这样的吗?在非常不成功的情况下,这将意味着大量的上下文切换(这会导致吞吐量低下,这在文档中有记载)。
What does this mean?
OS 会随时将线程安排到 运行。
How can I imagine this?
OS 几乎不知道 JVM 接下来 运行 想要什么。
Does Java work this way?
是的,Java 不控制 OS 调度程序。
这是什么意思?
这意味着持有锁的线程可以根据需要继续持有锁,并且可以连续多次重新获取同一个锁,等待时间最长的线程将一直等待,直到当前线程释放锁。
因此,公平性保证仅在锁空闲且 java 线程调度程序必须决定应将锁授予哪个线程时发挥作用。它被分配给等待时间最长的线程(在同步的情况下,它是随机的)。
这也意味着持有锁的线程没有被频繁调度,给其他线程更多的CPU时间,所以这个线程无法完成,从而没有释放锁。
这个问题是理论性的,很抱歉,这次我不能回避。
我正在了解 ReentrantLock
和 read this:
Note however, that fairness of locks does not guarantee fairness of thread scheduling.
这是什么意思?我怎么能想象这个?
假设现在没有任何人持有锁:
- 线程调度器唤醒
t1
个线程(不是等待时间最长的线程) t1
尝试获取锁- 锁拒绝
t1
因为t1
不是等待时间最长的线程 t1
睡觉- 线程调度器唤醒一个线程
Java是这样的吗?在非常不成功的情况下,这将意味着大量的上下文切换(这会导致吞吐量低下,这在文档中有记载)。
What does this mean?
OS 会随时将线程安排到 运行。
How can I imagine this?
OS 几乎不知道 JVM 接下来 运行 想要什么。
Does Java work this way?
是的,Java 不控制 OS 调度程序。
这是什么意思?
这意味着持有锁的线程可以根据需要继续持有锁,并且可以连续多次重新获取同一个锁,等待时间最长的线程将一直等待,直到当前线程释放锁。
因此,公平性保证仅在锁空闲且 java 线程调度程序必须决定应将锁授予哪个线程时发挥作用。它被分配给等待时间最长的线程(在同步的情况下,它是随机的)。
这也意味着持有锁的线程没有被频繁调度,给其他线程更多的CPU时间,所以这个线程无法完成,从而没有释放锁。