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