ReentrantLock公平性参数

时间:2017-11-24 12:47:32

标签: java multithreading reentrantlock

这个问题是完全理论化的,对不起,我无法避免这一次。 我正在了解ReentrantLockread this

  

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

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

我们假设现在没有人持有锁:

  1. 线程调度程序唤醒t1线程(谁不是最长的等待线程)
  2. t1尝试获取锁定
  3. 锁定拒绝t1因为t1不是最长的等待线程
  4. t1去睡觉
  5. 线程调度程序唤醒线程
  6. Java是否以这种方式工作?在一个非常不成功的情况下,这将意味着大量的上下文切换(导致吞吐量低,这在文档中写下来)。

2 个答案:

答案 0 :(得分:5)

  

这是什么意思?

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

  

我怎么能想象这个?

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

  

Java是否以这种方式工作?

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

答案 1 :(得分:2)

这是什么意思?

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

因此,仅当锁是免费的并且Java线程调度程序必须确定应将锁授予哪个线程时,公平保证才起作用。它被赋予最长的等待线程(在同步的情况下,它是随机的)。

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

相关问题