Victor Basso
Victor Basso

Reputation: 5796

ReentrantLock says "unlocked" but first thread stops

We're calling "lock()" on a ReentrantLock and threads are getting stuck there when they apparently shouldn't.

When debugging with a breakpoint just before the call to "lock()", the first thread would stop there with the program pointer going to "Thread.exit()". The lock object's toString() says "unlocked" and it's "state" attribute is "0". The behavior is not always the same. Sometimes the first thread goes past the lock as expected.

    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();
    }

Upvotes: 0

Views: 386

Answers (2)

Victor Basso
Victor Basso

Reputation: 5796

The problem was my breakpoint was not before "lock()" like I said, but on it. What happened is a bunch of threads would be blocked in that line by the breakpoint, one of them would still acquire the lock, and then the debugger would give me control over a random one of them which hadn't acquired the lock. And I was failing to check every thread blocked by the breakpoint to find the free one.

In the end I put the breakpoint actually before the lock and it behaved as expected. This was confusing and I hope the question will still help someone.

Note: I'm still confused by the fact the lock's state said "unlocked" in the debugger while I was controlling a locked thread.

Upvotes: 0

JohnnyAW
JohnnyAW

Reputation: 2876

try to put a breakpoint after userLock.lock(); then you should get the thread, that gets the lock. alternatively you could use userLock.getOwner(); right behind .lock() to see wich thread got the lock.

Upvotes: 1

Related Questions