Back-end/JAVA

Lock - StampedLock

지나짱-* 2023. 1. 30. 22:31

StampedLock은 Java 8에서 추가된 잠금 구현이다.

ReentrantLock과 비슷하게 동작하지만, 성능 향상이 가능하며, 적은 오버헤드로 더 효율적으로 동작할 수 있다.

 

StampedLock의 특징:

  • Optimistic locking: 클라이언트는 일단 읽기 접근을 시도하고, 실제로 접근이 어렵다면 나중에 락을 잡는다.
  • Read-write locking: 여러 쓰레드가 동시에 읽기 접근이 가능하고, 한 쓰레드만 쓰기 접근이 가능하다.
  • 간단한 API: StampedLock의 API는 간단하고 사용하기 쉽다.
import java.util.concurrent.locks.StampedLock;

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

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

  double distanceFromOrigin() {
    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);
  }
}

 x y 필드에 대한 접근을 조율하기 위해 StampedLock 사용하는 Point 클래스이다.

move 메서드는 필드를 수정하기 위해 write lock 획득하고, distanceFromOrigin 메서드는 다른 스레드가 write lock 소유하고 있지 않으면 필드를 최적화된 읽기 모드로 읽어들이려고 시도하지만, 다른 스레드가 write lock 소유하고 있을 경우에는 read lock 획득하는 방식이다.