我是否正确,这两种获取StampedLock锁的方法的唯一区别是:
stampedLock.readLock();
stampedLock.tryOptimisticRead();
那是当读锁至少由一个线程持有时,写锁不能接住它。而乐观读允许获得写锁定?
最佳答案
基本上是。
在互联网上已经有很多关于该主题的文字,但我会尽力让您简短理解。
stampedLock.readLock();
将尝试获取读锁,可能等待写锁结束。完成读锁定后,您必须使用
unlockRead(long)
进行解锁。锁不可重入。写锁必须等待独占访问,即所有读锁都将结束。stampedLock.tryOptimisticRead();
不锁定,但返回一个非零的戳记值,该值表示您请求读取的点。如果返回的值为零,则该锁当前处于互斥写锁中,而不等待写锁结束。可以同时获取写锁并执行写操作。执行读操作后,您可以通过
validate(long)
验证图章仍然有效。如果true
,则在此期间未获得写锁定,您可以继续。一般来说,如果将false
升级到readLock()
,则尝试使用实际的非排他锁再次读取。希望这可以帮助。 StampedLock JavaDoc和this article是开始阅读的好地方。