我是否正确,这两种获取StampedLock锁的方法的唯一区别是:

  stampedLock.readLock();
  stampedLock.tryOptimisticRead();


那是当读锁至少由一个线程持有时,写锁不能接住它。而乐观读允许获得写锁定?

最佳答案

基本上是。

在互联网上已经有很多关于该主题的文字,但我会尽力让您简短理解。



stampedLock.readLock();


将尝试获取读锁,可能等待写锁结束。完成读锁定后,您必须使用unlockRead(long)进行解锁。锁不可重入。写锁必须等待独占访问,即所有读锁都将结束。



stampedLock.tryOptimisticRead();


不锁定,但返回一个非零的戳记值,该值表示您请求读取的点。如果返回的值为零,则该锁当前处于互斥写锁中,而不等待写锁结束。可以同时获取写锁并执行写操作。执行读操作后,您可以通过validate(long)验证图章仍然有效。如果true,则在此期间未获得写锁定,您可以继续。一般来说,如果将false升级到readLock(),则尝试使用实际的非排他锁再次读取。

希望这可以帮助。 StampedLock JavaDoc和this article是开始阅读的好地方。

09-10 16:36