Java 是什么决定了两个竞争线程中的哪一个获得锁?

Java 是什么决定了两个竞争线程中的哪一个获得锁?,java,concurrency,Java,Concurrency,当两个线程试图获取同一对象的锁时,需要考虑哪些因素来决定将锁移交给哪个线程。根据: 此类的构造函数接受可选的公平性参数。当设置为true时,在争用下,锁有利于向等待时间最长的线程授予访问权限。否则,此锁不保证任何特定的访问顺序 如果您允许公平,则使用FIFO(先进先出),否则它看起来是随机的(根据我的观察)。根据: 唤醒正在该对象监视器上等待的单个线程。如果 任何线程都在等待此对象,其中一个线程被选中 觉醒了选择是任意的,由用户自行决定 实现。线程通过调用对象的监视器来等待对象的监视器 等待的方

当两个线程试图获取同一对象的锁时,需要考虑哪些因素来决定将锁移交给哪个线程。

根据:

此类的构造函数接受可选的公平性参数。当设置为true时,在争用下,锁有利于向等待时间最长的线程授予访问权限。否则,此锁不保证任何特定的访问顺序

如果您允许公平,则使用FIFO(先进先出),否则它看起来是随机的(根据我的观察)。

根据:

唤醒正在该对象监视器上等待的单个线程。如果 任何线程都在等待此对象,其中一个线程被选中 觉醒了选择是任意的,由用户自行决定 实现。线程通过调用对象的监视器来等待对象的监视器 等待的方法

因此,如果您使用
synchronized(obj){}
,您基本上无法控制哪个线程将获得
obj
上的锁,并且您无法做出任何假设。这取决于调度程序


如果您想要公平性(即,获得锁的下一个线程是队列中的第一个线程),请查看:它有一个布尔标志来指定您要强制公平性。

您假设他使用ReentrantLock。。。他只说“线程竞争同一个对象上的锁”,这可能是IMHOThanks中的任何对象。此外,同步(obj)块似乎调用了wait()。此外,您能否概述在同步块或方法之前、期间和之后执行的操作链?您的意思是什么?用于确保代码段互斥的算法?还是调度算法?对于前者,仅在概念上,您可能希望了解Peterson的算法:。对于后者,这里讨论:谢谢。我指的是Java方法中的互斥。像wait(),notify()。。。我将很高兴看到为尝试1个对象的2个线程模拟这些函数调用的序列。嘿,这类似于两个(或更多)男孩向一个女孩求婚。他们称之为婚姻;)