Комментарии 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();
Вот отсюда локи будут течь. Так код писать нельзя.
0
Наверно, нужно чуть поправить вариант использования:
...
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();
}
0
Спасибо! Обновил.
0
Лучше так:
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) {
}
}
}
Так и код чище и абстракции не протекают и шанс ошибиться ниже и даже писать меньше.
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Распределенное управление конкурентностью