【问题标题】:ReentrantLock fairness parameterReentrantLock 公平参数
【发布时间】:2018-05-08 11:47:03
【问题描述】:

这个问题完全是理论上的,很抱歉,这次我无法避免。 我正在学习ReentrantLockread this

但是请注意,锁的公平性并不能保证线程调度的公平性。

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

假设现在没有人持有锁:

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

Java 是否以这种方式工作?在非常不成功的情况下,这将意味着大量的上下文切换(这会导致吞吐量下降,这在文档中有所说明)。

【问题讨论】:

  • Doc 说公平锁保证不会出现饥饿,但是许多线程之一可能会连续多次获得锁,而其他线程没有进展。意味着它不会避免最近释放的线程再次获得锁同一个锁
  • @OomphFortuity 那么公平参数的目的是什么。

标签: java multithreading reentrantlock


【解决方案1】:

这是什么意思?

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

所以,只有当锁是空闲的并且java线程调度程序必须决定应该给哪个线程锁时,公平保证才会发挥作用。并且它被赋予最长等待线程(在同步的情况下,它是随机的)。

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

【讨论】:

    【解决方案2】:

    这是什么意思?

    操作系统会安排线程随时运行。

    我怎么能想象到这个?

    操作系统几乎不知道 JVM 下一步要运行什么。

    Java 是否以这种方式工作?

    是的,Java 不控制操作系统调度程序。

    【讨论】:

    • @Akki 这对于 20 年未使用的绿色线程来说是正确的。大多数 JVM 使用的本机线程是 OS 线程,由 OS 管理。
    猜你喜欢
    • 2018-10-11
    • 2012-12-04
    • 1970-01-01
    • 2022-01-09
    • 2012-11-14
    • 2016-01-18
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多