Java 重入锁公平性参数
这个问题完全是理论性的,很抱歉,这次我无法回避。 我正在学习关于ReentrantLock的Java 重入锁公平性参数,java,multithreading,reentrantlock,Java,Multithreading,Reentrantlock,这个问题完全是理论性的,很抱歉,这次我无法回避。 我正在学习关于ReentrantLock的和: 但是请注意,锁的公平性并不能保证线程调度的公平性 这是什么意思?我怎么能想象呢 假设现在没有人持有锁: 线程调度程序唤醒t1thread(谁不是等待时间最长的线程) t1尝试获取锁 锁拒绝t1,因为t1不是等待时间最长的线程 t1进入睡眠状态 线程调度程序唤醒一个线程 Java是这样工作的吗?在非常不成功的情况下,这将意味着大量的上下文切换(这将导致低吞吐量,这在文档中有所记录) 这是什么意思 操作
和:
但是请注意,锁的公平性并不能保证线程调度的公平性
这是什么意思?我怎么能想象呢
假设现在没有人持有锁:
线程调度程序唤醒t1
thread(谁不是等待时间最长的线程)
t1
尝试获取锁
锁拒绝t1
,因为t1
不是等待时间最长的线程
t1
进入睡眠状态
线程调度程序唤醒一个线程
Java是这样工作的吗?在非常不成功的情况下,这将意味着大量的上下文切换(这将导致低吞吐量,这在文档中有所记录)
这是什么意思
操作系统将安排线程随时运行
我怎么能想象呢
操作系统几乎不知道JVM下一步要运行什么
Java是这样工作的吗
是的,Java不控制操作系统调度程序。这意味着什么
这意味着持有锁的线程可以继续持有锁,只要它愿意,并且可以连续多次重新获得相同的锁,等待时间最长的线程将继续等待,直到当前线程释放锁
所以,只有当锁是空闲的,java线程调度程序必须决定应该给哪个线程锁时,公平性保证才会起作用。它被赋予等待时间最长的线程(在同步的情况下,它是随机的)
这也意味着持有锁的线程没有被频繁调度,其他线程被赋予更多的CPU时间,因此,该线程无法完成,因此无法释放锁。Doc说,公平锁保证了不缺乏饥饿感,但许多线程中的一个可能会连续多次获得锁,而另一个线程则无法继续。这意味着它不会避免最近释放锁的线程再次获得锁lock@Akki这是对于已经20年没有使用过的绿色螺纹来说也是如此。大多数JVM使用的本机线程是OS线程,由OS管理。