java - Spring LockRegistry : when to call LockRegistry. 获取()

标签 java spring locking spring-integration

我不确定何时调用 RedisLockRegistry.obtain(String lockKey) (或更一般地说,LockRegistry.obtain(String lockKey))。我应该在应用程序启动时只获取一次锁,然后照常锁定/解锁它,还是应该每次在调用 lock 之前(在使用它之前)获取锁?

目前我正在使用后一个选项,但是,我不确定这是否真的有必要。

最佳答案

了解如何使用它的最佳方法是遵循框架中的现有模式。

我想说的最简单的示例是SimpleMessageStore:

@Override
public void addMessagesToGroup(Object groupId, Message<?>... messages) {
    Lock lock = this.lockRegistry.obtain(groupId);
    try {
        lock.lockInterruptibly();
        boolean unlocked = false;
        ...
        }
        finally {
            if (!unlocked) {
                lock.unlock();
            }
        }
    }
}

作为一个使用场所。

另一个示例是AbstractCorrelatedMessageHandler:

@Override
protected void handleMessageInternal(Message<?> message) throws Exception {
    Object correlationKey = this.correlationStrategy.getCorrelationKey(message);
...
    UUID groupIdUuid = UUIDConverter.getUUID(correlationKey);
    Lock lock = this.lockRegistry.obtain(groupIdUuid.toString());

    lock.lockInterruptibly();
    try {
    ...
    }
    finally {
        lock.unlock();
    }
}

所以,是的,在使用目标 Lock API 之前,您始终需要调用 obtain()。但一般来说,它不会造成伤害,不要重新获得它。让我们检查一下 RedisLockRegistry 代码:

public Lock obtain(Object lockKey) {
    Assert.isInstanceOf(String.class, lockKey);
    String path = (String) lockKey;
    return this.locks.computeIfAbsent(path, RedisLock::new);
}

LockRegistry 和此 obtain 背后的想法是允许最终用户访问共享资源(在我们的例子中为 Lock)只。因此,如果您的key 非常全局,足以在应用程序开始时获取它的锁,那么您完全可以决定是否保留关联的Lock实例。

关于java - Spring LockRegistry : when to call LockRegistry. 获取(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47830824/

相关文章:

mysql - MySQL 的写锁应该暂停读锁

linux - Linux 上的 Perl 集群 : what if many processes wait to open a locked file?

java - 我有一个我不明白的 Java 性能问题

java - 有人能解释一下Java中的Function对象是什么吗?

java - 从 native 查询和转换中检索数据

java - 如何正确使用spring boot测试?

java - 在 Spring Data Commons 2.0.4 中找不到 QueryDslPredicateExecutor

java - Mock beans 与 Mockito 的 Spring Boot 单元测试

django - 如何处理 Django-PostgreSQL 锁

java - 接口(interface)由数千个类实现,因此如果接口(interface)发生变化,那么如何减少它