Trylock和Lock.trylock(超时,单位)的行为



我对trylock和lock.trylock(超时,单位)retentrantlock的函数有很少的疑问。

  1. 如果两个线程通过调用lock.trylock(超时,单位)等待锁定会发生什么。哪个线程会锁定?另一个等待线程会发生什么?
    示例:
    在t = 0 th1拥有锁
    在t = 1 th2呼叫lock.trylock(超时,单位)4秒
    在t = 2 th3呼叫lock.trylock(超时,单位)3秒
    在t = 3 th1释放锁
    我认为如果锁定是公平的,则TH2将获得锁。我是正确的吗?
    如果锁定不公平,将会发生什么。另一个线程会发生什么,该线程会等待剩余时间吗?

  2. 哪种方法是先验,定时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 不具有相同的"驳船"行为。

  1. 在公平订购的繁琐的情况下,第一次致电Lock.trylock(超时,单位)。根据Trylock -Java Doc,

如果锁定不由另一个线程持有,则获取锁定,并立即以该值为true,将锁定计数设置为一个。如果设置了此锁定使用公平的订购策略,则如果其他任何线程正在等待锁,则不会获得可用的锁。这与Trylock()方法相反。如果您想要一个定时的trylock,它确实允许在公平的锁上进行驳船,请将定时和未定时的表格组合在一起: if (lock.tryLock() || lock.tryLock(timeout, unit) ) { ... }

  1. TH3将有锁

如果锁定不由另一个线程持有,则获取锁定,并立即以该值为true,将锁定计数设置为一个。即使设置了此锁定使用公平的订购策略,如果可用的话,trylock()的调用也将立即获取,无论其他线程是否当前正在等待锁。在某些情况下,"驳船"行为也可能有用,即使它破坏了公平。如果您想尊重此锁定的公平设置,请使用几乎等效的Trylock(0,TimeUnit.seconds)(也可以检测到中断)。

最新更新