当前位置: 首页 > 知识库问答 >
问题:

Reentry antLock说“已解锁”,但第一个线程停止

南宫才艺
2023-03-14

我们在ReentantLock上调用“lock()”,线程卡在那里,而它们显然不应该卡在那里。

在调用“lock()”之前使用断点进行调试时,第一个线程将停止在那里,程序指针将指向“thread.exit()”。lock对象的toString()表示“unlocked”,其“state”属性为“0”。行为并不总是一样的。有时,第一个线程会像预期的那样通过锁。

    userLock.lock(); //first thread sometimes gets stuck here (and the following ones as well)
                     //"userLock" has "state=0" and toString() says "UNLOCKED"

    try {
        Transaction tr = HibernateConfig.getSessionFactory().getCurrentSession().beginTransaction();
        try {
            execute();
            tr.commit();
        } catch (ConstraintViolationException e) {
            //probably traces with repeated time
            System.err.println(e.getMessage());
            if (tr.isActive()) {
                tr.rollback();
            }
        } catch (RuntimeException e) {
            e.printStackTrace();
            if (tr.isActive()) {
                tr.rollback();
            }
        }
    } catch (Throwable e) {
        e.printStackTrace();
    } finally {
        userLock.unlock();
    }

共有2个答案

单于经纬
2023-03-14

问题是,我的断点不在我所说的“lock()”之前,而是在它上面。发生的情况是,一组线程会在该行中被断点阻塞,其中一个线程仍然会获取锁,然后调试器会让我控制其中一个没有获取锁的随机线程。我无法检查被断点阻塞的每个线程,以找到空闲线程。

最后,我将断点放在锁之前,它的行为与预期的一样。这让人很困惑,我希望这个问题仍能帮助一些人。

注意:当我控制一个锁定的线程时,锁的状态在调试器中显示为“unlocked”,这一事实仍然让我感到困惑。

申屠亦
2023-03-14

尝试在userLock之后放置断点。锁定();然后你应该得到线程,那就得到锁。或者,您可以使用userLock。getOwner();就在后面。lock()查看哪个线程获得了锁。

 类似资料:
  • 问题内容: 我有一个LockManager来管理多个线程的锁。有时线程是坏男孩,我必须杀死它们并要求LockManager释放所有锁。但是,由于我无法在Java中使用ReentrantLock,因此无法解锁另一个线程拥有的锁。 我被迫使用锁(不能使用信号灯,这是作业的重点)。是否有任何Java Lock实现可让我解锁其他线程拥有的锁? 到目前为止,我考虑的选项是: 以允许我执行此操作的方式重新实现

  • 我有一个LockManager管理几个线程的锁。有时线程是坏男孩,我必须杀死他们,并要求锁经理释放他们所有的锁。但是,由于我在java中使用ReentrantLock,这是不可能的,我不能解锁另一个线程拥有的锁。 我被迫使用锁(不能使用信号量,这是作业的重点)。是否有Java锁实现允许我解锁其他线程拥有的锁? 到目前为止,我考虑的选择是: null 可重入锁-从另一个线程解锁 从不拥有锁的线程中解

  • 问题内容: 我在Java中的线程上有些挣扎,我有三个线程- 线程1,线程2和线程3。那些启动时正在执行某些任务,我想通过thread1停止这两个线程。我将thread1放在,然后停止两个线程,但是两个线程的进程仍在运行。你有什么想法吗? 问题答案: 您如何试图阻止他们??警告此方法已弃用。 而是考虑对线程1使用某种标志来与线程2和3通信,它们应该停止。实际上,您可能会使用interrupts。 下

  • 问题内容: 帮助客户解决他们遇到的问题。我更多地是sysadmin / DBA的人,所以我在努力帮助他们。他们说这是内核/环境中的错误,在我坚持要在他们的代码中或寻求供应商对OS的支持之前,我试图证明或证明这一点。 发生在Red Hat和Oracle Enterprise Linux 5.7(和5.8)上,应用程序用C ++编写 他们遇到的问题是主线程启动一个单独的线程来执行可能长时间运行的TCP

  • Apache Tomcat说过很多次: web应用程序[/MyServlet]似乎已启动名为[pool-61-thread-2]的线程,但未能停止该线程。这很可能会造成内存泄漏。 这样危险吗?servlet应该能够每天处理10.000个请求。如何关闭线程时,他们已经完成?

  • 问题内容: 线程都是可运行的,并且它们拥有相同的锁。两个线程都可以运行时,它们可以锁定相同的地址吗?那是JRE错误吗? 问题答案: 该问题仅存在于线程转储中。实际上,在任何时间点,锁都仅由一个线程持有。但是,线程转储显示两个具有相同锁的不同线程,因为它不是原子的。 可以使用以下程序轻松重现该行为: