StampedLock.validate()是什么意思?

时间:2019-04-10 03:12:27

标签: java validation concurrency

javase document中有这样的示例代码:

class Point {
   private double x, y;
   private final StampedLock sl = new StampedLock();

   void move(double deltaX, double deltaY) { // an exclusively locked method
     long stamp = sl.writeLock();
     try {
       x += deltaX;
       y += deltaY;
     } finally {
       sl.unlockWrite(stamp);
     }
   }

   double distanceFromOrigin() { // A read-only method
     long stamp = sl.tryOptimisticRead();
     double currentX = x, currentY = y;
     if (!sl.validate(stamp)) {
        stamp = sl.readLock();
        try {
          currentX = x;
          currentY = y;
        } finally {
           sl.unlockRead(stamp);
        }
     }
     return Math.sqrt(currentX * currentX + currentY * currentY);
   }

   void moveIfAtOrigin(double newX, double newY) { // upgrade
     // Could instead start with optimistic, not read mode
     long stamp = sl.readLock();
     try {
       while (x == 0.0 && y == 0.0) {
         long ws = sl.tryConvertToWriteLock(stamp);
         if (ws != 0L) {
           stamp = ws;
           x = newX;
           y = newY;
           break;
         }
         else {
           sl.unlockRead(stamp);
           stamp = sl.writeLock();
         }
       }
     } finally {
       sl.unlock(stamp);
     }
   }
 }

在函数distanceFromOrigin中,它使用了乐观锁。我理解这一点:由于写的可能性很小,因此请直接阅读。

然后,使用validate函数来验证数据是否已被其他线程修改。

我认为这没有道理。这是典型的比赛条件!

if之后和return之前,其他线程可以修改数据。

您可能会说,由于使用了乐观锁,因此不一致是不可避免的。

如果是这样,为什么Java需要设计此validate函数?

0 个答案:

没有答案