찾다

 >  Q&A  >  본문

java - 公平锁和非公平锁的区别?

此类的构造方法接受一个可选的公平 参数。当设置为 true 时,在多个线程的争用下,这些锁倾向于将访问权授予等待时间最长的线程。否则此锁将无法保证任何特定访问顺序。与采用默认设置(使用不公平锁)相比,使用公平锁的程序在许多线程访问时表现为很低的总体吞吐量(即速度很慢,常常极其慢),但是在获得锁和保证锁分配的均衡性时差异较小。不过要注意的是,公平锁不能保证线程调度的公平性。因此,使用公平锁的众多线程中的一员可能获得多倍的成功机会,这种情况发生在其他活动线程没有被处理并且目前并未持有锁时。还要注意的是,未定时的 tryLock 方法并没有使用公平设置。因为即使其他线程正在等待,只要该锁是可用的,此方法就可以获得成功。

这段话是java.util.concurrent.locks.ReentrantLock中的介绍, 其中对于公平锁的介绍我很不理解.

  1. 为什么"公平锁不能保证线程调度的公平性", 是因为不同线程对于锁的占用时间不同, 导致对于短作业的线程不利吗?

  2. "使用公平锁的众多线程中的一员可能获得多倍的成功机会"这句话是什么意思

迷茫迷茫2767일 전428

모든 응답(2)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-18 09:48:51

    스레드 스케줄링 메커니즘의 요소를 추가하면 이해하기 어렵지 않습니다...
    공정한 잠금은 객체를 처음 획득했는지 여부에 따라 달라지며, 재진입 잠금이라는 개념도 있습니다
    두 번째 포인트. . 스레드에 "양보"가 있지만 신호만 보냅니다. 처리 여부는 스케줄링 메커니즘의 분위기에 따라 다릅니다. 마찬가지로 공정한 잠금이 성공하더라도 스케줄링 메커니즘에 따라 다릅니다

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 09:48:51

    스케줄링 스레드는 잠금이 아닌 운영 체제에 의해 제어됩니다. 잠금은 대기 시간이 가장 긴 스레드에만 잠금이 부여되도록 보장할 수 있지만 운영 체제가 이 스레드를 예약하지 않으면 쓸모가 없습니다.

    회신하다
    0
  • 취소회신하다