这个问题完全是理论性的,我很抱歉,但这次我不能回避。我正在学习ReentrantLock
和阅读这篇文章
但是,请注意,锁的公平性并不能保证线程调度的公平性。
这是什么意思?我怎么能想象得到呢?
假设现在没有人持有锁:
t1
线程(谁不是等待时间最长的线程)t1
试图获取锁t1
,因为t1
不是等待时间最长的线程t1
睡着了Java是这样工作的吗?在一个非常不成功的情况下,这将意味着大量的上下文切换(这将导致糟糕的吞吐量,这将写入文档中)。
发布于 2017-11-24 13:02:18
这是什么意思?
操作系统会安排线程在任何时候运行。
我怎么能想象得到呢?
操作系统几乎不知道JVM下一步想要运行什么。
Java是这样工作的吗?
是的,Java并不控制操作系统调度程序。
发布于 2018-09-02 09:20:00
这是什么意思?
这意味着线程保持锁可以继续持有锁,只要它愿意,并且可以连续多次重新获取相同的锁,等待时间最长的线程将一直等待到当前线程释放锁为止。
因此,只有在锁是空闲的情况下,公平保证才会发挥作用,而java线程调度程序必须决定应该将锁分配给哪个线程。并且给出了最长等待线程(在同步的情况下,它是随机的)。
这也意味着持有锁的线程没有被频繁地调度,其他线程被给予更多的CPU时间,因此这个线程无法完成,因此不能释放锁。
https://stackoverflow.com/questions/47473650
复制相似问题