Java tryLock和lock的行为。tryLock(超时,单位)
我对tryLock和lock.tryLocktimeout,ReentrantLock的单位函数几乎没有疑问 如果两个线程通过调用lock.tryLocktimeout,unit.等待一个锁,那么会发生什么情况?当两个线程都在等待时,锁被释放。超时尚未完成。我的问题是哪个线程将获得锁?另一个等待线程会发生什么? 例子: 在t=0时,th1拥有锁 在t=1时,2次调用lock.tryLocktimeout,单位为4秒 在t=2时,3次调用lock.tryLocktimeout,单位为3秒 在t=3时,1释放锁 我认为如果锁是公平的,那么2号就会得到锁。我是对的? 如果锁不公平会发生什么?另一个线程会发生什么,该线程会等待剩余的时间吗 哪种方法是优先的,定时的tryLock还是不定时的tryLock。 实例 在t=0时,th1拥有锁 在t=1时,调用lock.tryLocktimeout,单位为2秒 在t=2时,th1同时释放锁,一些线程th3调用lock.tryLock哪个线程th1或th3将获得锁 它有一根线 第一次调用lock.tryLocktimeout,公平排序策略下的单位。根据 , 如果锁未被另一个线程持有,则获取锁,并立即返回值true,将锁持有计数设置为1。如果此锁已设置为使用公平排序策略,则如果任何其他线程正在等待该锁,则不会获取可用锁。这与tryLock方法相反。如果您想要一个允许在公平锁上闯关的定时锁,请将定时和非定时窗体组合在一起: 如果lock.tryLock | | lock.tryLocktimeout,单位{…} th3将拥有锁 如果锁未被另一个线程持有,则获取锁,并立即返回值true,将锁持有计数设置为1。即使将该锁设置为使用公平排序策略,调用tryLock也会立即获取该锁(如果该锁可用),无论当前是否有其他线程正在等待该锁。这种讨价还价行为在某些情况下是有用的,即使它破坏了公平性。如果您想遵守此锁的公平性设置,请使用tryLock0,TimeUnit.SECONDS,这几乎等同于它还检测到中断 我认为如果锁是公平的,那么2号就会得到锁。我是对的 对。这就是fair的意思:它意味着进入队列的第一个线程将是第一个获得锁的线程 如果锁定不公平会发生什么 这意味着线程获取锁的顺序不需要与它们进入队列的顺序相同。他们可能会按照这个顺序获得锁,也可能不会。这是JVM实现者的选择。通常,JVM实现者会尝试做一些能够最大化某些典型应用程序性能的事情 在t=2时,th1同时释放锁 当您试图解释多线程程序的行为时,没有任何理由说两个事件同时发生。这只会使解释复杂化,而且它不能提供比假装它不可能发生更深刻的见解 …某些线程th3调用lock.tryLock reentrantLock.tryLock方法是特殊的。如果锁是公平的,那么在某些情况下,调用tryLock的线程显然可以在等待它的其他线程之前获得锁。我不完全理解在什么情况下会发生这种情况,但您可以在Javadoc中阅读:搜索单词,bargging 如果th2在th1释放锁时等待锁,那么显然有一段时间,th3可以在th2有机会之前与tryLock闯入并获取锁。我不知道时间窗口是如何定义的 请注意,reentrantLock.tryLockn没有相同的驳船行为Java tryLock和lock的行为。tryLock(超时,单位),java,multithreading,concurrency,locking,Java,Multithreading,Concurrency,Locking,我对tryLock和lock.tryLocktimeout,ReentrantLock的单位函数几乎没有疑问 如果两个线程通过调用lock.tryLocktimeout,unit.等待一个锁,那么会发生什么情况?当两个线程都在等待时,锁被释放。超时尚未完成。我的问题是哪个线程将获得锁?另一个等待线程会发生什么? 例子: 在t=0时,th1拥有锁 在t=1时,2次调用lock.tryLocktimeout,单位为4秒 在t=2时,3次调用lock.tryLocktimeout,单位为3秒 在t=3