sonarqube - 当前线程不是锁的所有者!淡褐色

标签 sonarqube locking hazelcast java.util.concurrent

我有一个 Spring boot 应用程序,其中包含用于缓存的 Hazelcast。 当多个实例与 Hazelcast 集群时,我在解锁操作中遇到此异常:

java.lang.IllegalMonitorStateException: Current thread is not owner of the lock! -> Owner: 33ce48f8-dda3-471f-abae-994d25dcc030, thread ID: 55
    at com.hazelcast.concurrent.lock.operations.UnlockOperation.unlock(UnlockOperation.java:75) ~[hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.concurrent.lock.operations.UnlockOperation.run(UnlockOperation.java:64) ~[hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.Operation.call(Operation.java:170) ~[hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.call(OperationRunnerImpl.java:208) [hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:197) [hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:413) [hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:153) [hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:123) [hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.run(OperationThread.java:110) [hazelcast-3.11.4.jar!/:3.11.4]

这是我执行锁定和解锁操作的组件:

package com.companyname.service.servicename.job;
import com.hazelcast.core.ILock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class UpdateRaceCacheJob {

    @Scheduled(fixedDelay = 10000)
    public void updateRaceCache() {
        ILock lock = hazelcastInstance.getLock("race-lock");
        try {
            if (!lock.tryLock()) {
                return;
            }

            // service calls

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

当我将 lock.unlock(); 行替换为:

if (lock.isLockedByCurrentThread()) {
    lock.unlock();    
}

我收到来自 Sonar 的警告: 沿着这个方法的所有执行路径解锁这个锁。

谢谢!

最佳答案

由于 Hazelcast 锁是分布式的,它们受到线程所有权的保护,因此只有锁定它的线程才能解锁。

在您的代码中,您使用了可能返回falsetryLock。但是,finally block 在任何情况下都会执行解锁操作。因此,每次您无法获得锁(因为它被集群中的某个其他线程锁定)时,您将尝试解锁它并且您将获得该异常。

最好使用 lock.isLockedByCurrentThread() 检查所有权。

关于sonarqube - 当前线程不是锁的所有者!淡褐色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56867888/

相关文章:

sonarqube - Sonarqube-我不断收到错误 "The ' 报告'参数丢失”

sonarqube - SonarQube 5.2 中的分析模式

c# - 现有文件部分的锁定检查

Hazelcast 服务器作为 Linux 服务

java - 是否可以创建 Hazelcast ExecutorService 以在集群的子集上执行?

sonarqube - Sonar 分析两种语言

maven - Hudson 3.1.0 + Maven 2.2.1 + sonar 3.7.3 [ERROR] 加载器约束违规 : when resolving field "VISIBLE"

mysql - 两个事务无法在同一个表上获得 IX 锁,MySql

iOS - Objective-C - 如何在等待时停止 NSThread?

hazelcast 队列上的 java 执行器服务