Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重入锁公平性参数_Java_Multithreading_Reentrantlock - Fatal编程技术网

Java 重入锁公平性参数

Java 重入锁公平性参数,java,multithreading,reentrantlock,Java,Multithreading,Reentrantlock,这个问题完全是理论性的,很抱歉,这次我无法回避。 我正在学习关于ReentrantLock的和: 但是请注意,锁的公平性并不能保证线程调度的公平性 这是什么意思?我怎么能想象呢 假设现在没有人持有锁: 线程调度程序唤醒t1thread(谁不是等待时间最长的线程) t1尝试获取锁 锁拒绝t1,因为t1不是等待时间最长的线程 t1进入睡眠状态 线程调度程序唤醒一个线程 Java是这样工作的吗?在非常不成功的情况下,这将意味着大量的上下文切换(这将导致低吞吐量,这在文档中有所记录) 这是什么意思 操作

这个问题完全是理论性的,很抱歉,这次我无法回避。 我正在学习关于ReentrantLock的
和:

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

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

假设现在没有人持有锁:

  • 线程调度程序唤醒
    t1
    thread(谁不是等待时间最长的线程)
  • t1
    尝试获取锁
  • 锁拒绝
    t1
    ,因为
    t1
    不是等待时间最长的线程
  • t1
    进入睡眠状态
  • 线程调度程序唤醒一个线程
  • Java是这样工作的吗?在非常不成功的情况下,这将意味着大量的上下文切换(这将导致低吞吐量,这在文档中有所记录)

    这是什么意思

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

    我怎么能想象呢

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

    Java是这样工作的吗

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

    这意味着什么

    这意味着持有锁的线程可以继续持有锁,只要它愿意,并且可以连续多次重新获得相同的锁,等待时间最长的线程将继续等待,直到当前线程释放锁

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


    这也意味着持有锁的线程没有被频繁调度,其他线程被赋予更多的CPU时间,因此,该线程无法完成,因此无法释放锁。

    Doc说,公平锁保证了不缺乏饥饿感,但许多线程中的一个可能会连续多次获得锁,而另一个线程则无法继续。这意味着它不会避免最近释放锁的线程再次获得锁lock@Akki这是对于已经20年没有使用过的绿色螺纹来说也是如此。大多数JVM使用的本机线程是OS线程,由OS管理。