我对trylock和lock.trylock(超时,单位)retentrantlock的函数有很少的疑问。
-
如果两个线程通过调用lock.trylock(超时,单位)等待锁定会发生什么。哪个线程会锁定?另一个等待线程会发生什么?
示例:
在t = 0 th1拥有锁
在t = 1 th2呼叫lock.trylock(超时,单位)4秒
在t = 2 th3呼叫lock.trylock(超时,单位)3秒
在t = 3 th1释放锁
我认为如果锁定是公平的,则TH2将获得锁。我是正确的吗?
如果锁定不公平,将会发生什么。另一个线程会发生什么,该线程会等待剩余时间吗? -
哪种方法是先验,定时trylock或Untime Trylock。
示例
在t = 0 th1拥有锁
在t = 1 th2呼叫lock.trylock(超时,单位)2秒在t = 2 th1同时释放锁定锁定锁定th3呼叫lock.trylock()哪个线程Th1或Th3会锁定?th*站在线程。
我认为如果锁定是公平的,则TH2将获得锁。我是正确的吗?
是。这就是"公平"的意思:这意味着进入队列的第一个线程将是第一个获得锁的线程。
如果锁定不公平会发生什么?
这意味着螺纹获取锁的顺序不需要与他们进入队列的顺序相同。他们可能会按照该顺序获取锁,否则他们可能不会获取锁。这是JVM实施者的选择。通常,JVM实施者会尝试做一些可以最大程度地提高某些"典型"应用程序的性能的事情。
在t = 2 Th1同时释放锁...
当您试图解释多线程程序的行为时,没有任何理由说两个事件同时发生。它只会使解释复杂化,并且没有比假装不可能发生的更深入的见解。
...一些线程TH3调用lock.trock()
reentrantLock.tryLock()
方法很特别。如果锁定是公平的,那么在某些情况下,调用tryLock()
的线程显然可以在等待它的其他线程之前获取锁。我不完全理解可能发生的情况,但是您可以在Javadoc中阅读有关它的信息:.html#trylock()(搜索单词" barging"。)
如果TH2在释放锁定时正在等待锁,则显然有一些时间窗口,在此期间,Th3可以用tryLock()
"驳船"并在TH2获得机会之前获取它。我不知道如何定义那个时间窗口。
请注意, reentrantLock.tryLock(n)
do 不具有相同的"驳船"行为。
- 在公平订购的繁琐的情况下,第一次致电Lock.trylock(超时,单位)。根据Trylock -Java Doc,
如果锁定不由另一个线程持有,则获取锁定,并立即以该值为true,将锁定计数设置为一个。如果设置了此锁定使用公平的订购策略,则如果其他任何线程正在等待锁,则不会获得可用的锁。这与Trylock()方法相反。如果您想要一个定时的trylock,它确实允许在公平的锁上进行驳船,请将定时和未定时的表格组合在一起:
if (lock.tryLock() || lock.tryLock(timeout, unit) ) { ... }
- TH3将有锁
如果锁定不由另一个线程持有,则获取锁定,并立即以该值为true,将锁定计数设置为一个。即使设置了此锁定使用公平的订购策略,如果可用的话,trylock()的调用也将立即获取,无论其他线程是否当前正在等待锁。在某些情况下,"驳船"行为也可能有用,即使它破坏了公平。如果您想尊重此锁定的公平设置,请使用几乎等效的Trylock(0,TimeUnit.seconds)(也可以检测到中断)。