Open yngil opened 5 years ago
由于公平锁需要关心队列的情况,得按照队列里的先后顺序来获取锁(会造成大量的线程上下文切换),而非公平锁则没有这个限制。
公平锁的阻塞是按节点顺序进行的,而唤醒也是按节点顺序进行的,为什么会造成大量的线程上下文的切换呢?我的理解是,公平锁的吞吐量不是很高。
final boolean acquireQueued(final Node node, int arg) { boolean failed = true; try { boolean interrupted = false; for (;;) { final Node p = node.predecessor(); if (p == head && tryAcquire(arg)) { setHead(node); p.next = null; // help GC failed = false; return interrupted; } if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()) interrupted = true; } } finally { if (failed) cancelAcquire(node); } }
公平锁的阻塞是按节点顺序进行的,而唤醒也是按节点顺序进行的,为什么会造成大量的线程上下文的切换呢?我的理解是,公平锁的吞吐量不是很高。