2016-04-24 41 views
3

在Java中,我们可以按照如下用锁接口和ReentrantLock类实现公平这是等待大多数持续时间被授予访问锁定。的Java Multihreading同步与锁

任何人都可以提供详细的如何JVM保持长时间等待线程的轨道,即JVM如何实现公平。

+1

*一个公平的锁是线程获得锁的顺序,他们要求它的顺序* - ReentrantLock不会使用队列吗?我看了一下源代码,'ReentrantLock'有两个静态类,它们扩展了'AbstractQueuedSynchronizer',在类上公平而另一个不公平。 –

+1

@JonnyHenly正如你所说,它使用一个队列作为源代表。没有魔法在继续。 +1 –

+1

@PeterLawrey Woohoo!我喜欢没错。 –

回答

1

详细信息在源代码中。

  • “java.util.concurrent.locks.ReentrantLock中源”
  • “java.util.concurrent.locks.AbstractQueuedSynchronizer中源”

:和源代码可以通过谷歌搜索可以找到代码格外好评。

简短的回答是,每个锁都有一个等待线程队列,它被实现为一个链表。

  • 在“公平”情况下,尝试在队列非空时获取锁的线程被添加到队列末尾。

  • 在“不公平”的情况下,如果锁定当前是空闲的,则线程可以插入。这可以提供更好的性能,因为您不需要执行需要系统调用的线程上下文切换。