ReentrantLock 公平性参数

ReentrantLock fairness parameter

这个问题是理论性的,很抱歉,这次我不能回避。 我正在了解 ReentrantLockread this:

Note however, that fairness of locks does not guarantee fairness of thread scheduling.

这是什么意思?我怎么能想象这个?

假设现在没有任何人持有锁:

  1. 线程调度器唤醒t1个线程(不是等待时间最长的线程)
  2. t1 尝试获取锁
  3. 锁拒绝 t1 因为 t1 不是等待时间最长的线程
  4. t1 睡觉
  5. 线程调度器唤醒一个线程

Java是这样的吗?在非常不成功的情况下,这将意味着大量的上下文切换(这会导致吞吐量低下,这在文档中有记载)。

What does this mean?

OS 会随时将线程安排到 运行。

How can I imagine this?

OS 几乎不知道 JVM 接下来 运行 想要什么。

Does Java work this way?

是的,Java 不控制 OS 调度程序。

这是什么意思?

这意味着持有锁的线程可以根据需要继续持有锁,并且可以连续多次重新获取同一个锁,等待时间最长的线程将一直等待,直到当前线程释放锁。

因此,公平性保证仅在锁空闲且 java 线程调度程序必须决定应将锁授予哪个线程时发挥作用。它被分配给等待时间最长的线程(在同步的情况下,它是随机的)。

这也意味着持有锁的线程没有被频繁调度,给其他线程更多的CPU时间,所以这个线程无法完成,从而没有释放锁。