多线程请求时,同步锁授予顺序?

时间:2014-02-28 17:03:07

标签: java multithreading

当一个线程已经获取锁定时,多个线程尝试获取同步锁定。 我的理解是锁定将按获取锁定请求的顺序给出。

但根据O'Reilly的书,Java线程锁定将是最适合平台的。这是非常抽象的陈述。我认为平台主要是指操作系统。 我的问题是什么是基于哪个JVM决定什么是最适合平台以及开发人员如何计算它的标准 做编程?

更新: - 我知道我可以使用具有公平性参数的Lock对象。但只是想知道它如何与同步锁一起工作?

3 个答案:

答案 0 :(得分:2)

synchronized获取遵循non-fair锁定政策。也就是说,阻塞时首先进入的线程可能不是第一个获取的线程。如果您想要fair锁,请使用new ReentrantLock(true)

答案 1 :(得分:0)

从JDK6开始(在HotSpot JVM中),它使用称为偏置锁定的算法。请看Oracle的这个white paper,尤其是关于偏置锁定的部分。他们引用this paper进一步描述了算法的细节。

至于开发商应如何解释这一点,IMO唯一重要的部分是它不公平。你有疑问。除非您正在编写高频交易平台或其他东西,否则永远不必担心其他任何事情。

除非您有理由,否则您通常应该支持不公平的锁定以防止公平锁定,因为前者通常具有更高的吞吐量。

答案 2 :(得分:0)

  

我的理解是锁定将按获取锁定请求的顺序给出。

我相信这只适用于绿色线程(没有人真正使用过它)。

  

我的问题是什么标准基于哪个JVM决定什么是最适合平台的标准以及开发人员在编程时如何计算它?

我不认为JVM在运行时“决定”。线程模型将被编译到JVM中。