Как стать автором
Обновить

Комментарии 5

У вас в коде ошибки.

    if (lock.acquire(100, TimeUnit.MILLISECONDS)) {
        // Access the shared resource
        // Perform your operations here
        // Release the lock
        lock.release();
    }
    // Close the ZooKeeper connection
    lock.close();

Вот отсюда локи будут течь. Так код писать нельзя.

Принято, спасибо!

Наверно, нужно чуть поправить вариант использования:

...
  DistributedLock lock = new DistributedLock(zkConnectionString, lockPath);
  try {
    if (lock.acquire(100, TimeUnit.MILLISECONDS)) {
      try {
        // Access the shared resource
        // Perform your operations here
      } finally {
        lock.release();
      }
    }
  } finally {
    lock.close();
  }

Спасибо! Обновил.

Лучше так:

public void someUsersLogic(CuratorFramework client) {
    try (DistributedLock lock = new DistributedLock(client, "lockPath", 10, TimeUnit.SECONDS)) {
        System.out.println("locked");
    } catch (Exception e) {
        throw new RuntimeException(e); //сюда попадаем при ошибках взятия лока
    }
}

public class DistributedLock implements AutoCloseable {
    private final InterProcessMutex lock;

    public DistributedLock(CuratorFramework client, String lockPath, long waitTime, TimeUnit timeUnit) throws Exception {
        lock = new InterProcessMutex(client, lockPath);
        lock.acquire(waitTime, timeUnit);
    }

    @Override
    public void close() {
        try {
            lock.release();
        } catch (Exception ignored) {
        }
    }
}

Так и код чище и абстракции не протекают и шанс ошибиться ниже и даже писать меньше.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории