Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java tryLock和lock的行为。tryLock(超时,单位)_Java_Multithreading_Concurrency_Locking - Fatal编程技术网

Java tryLock和lock的行为。tryLock(超时,单位)

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

我对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没有相同的驳船行为