Что означает StampedLock.validate ()? - PullRequest
0 голосов
/ 10 апреля 2019

Существует такой пример кода в документе javase :

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.

Я не думаю, что это делаетsense. Это типичное состояние гонки!

После if и до return другие потоки могут изменять данные.

Можно сказать, что, поскольку используются оптимистичные блокировки, несоответствиянеизбежно.

Если да, то почему Java должна спроектировать эту validate функцию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...