这个问题是完全理论化的,对不起,我无法避免这一次。
我正在了解ReentrantLock
和read this:
但请注意,锁的公平性并不能保证线程调度的公平性。
这是什么意思?我怎么能想象这个?
我们假设现在没有人持有锁:
t1
线程(谁不是最长的等待线程)t1
尝试获取锁定t1
因为t1
不是最长的等待线程t1
去睡觉Java是否以这种方式工作?在一个非常不成功的情况下,这将意味着大量的上下文切换(导致吞吐量低,这在文档中写下来)。
答案 0 :(得分:5)
这是什么意思?
操作系统会安排线程随时运行。
我怎么能想象这个?
操作系统几乎不知道JVM下一步要运行什么。
Java是否以这种方式工作?
是的,Java并不控制操作系统调度程序。
答案 1 :(得分:2)
这是什么意思?
这意味着持有线程的线程可以根据需要继续保持该锁,并且可以连续多次多次获取相同的锁,最长的等待线程将一直等待,直到当前线程释放该锁为止。
因此,仅当锁是免费的并且Java线程调度程序必须确定应将锁授予哪个线程时,公平保证才起作用。它被赋予最长的等待线程(在同步的情况下,它是随机的)。
这也意味着持有锁的线程不会被频繁调度,而其他线程被分配了更多的CPU时间,因此该线程无法完成,因此不会释放锁。