0

ReentrantLock で "lock()" を呼び出していますが、明らかにすべきではないスレッドがスタックしてしまいます。

"lock()" の呼び出しの直前にブレークポイントを指定してデバッグすると、最初のスレッドがそこで停止し、プログラム ポインターが "Thread.exit()" に移動していました。ロック オブジェクトの toString() は「ロック解除済み」と表示され、その「状態」属性は「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();
    }
4

2 に答える 2

1

userLock.lock(); の後にブレークポイントを設定してみてください。次に、ロックを取得するスレッドを取得する必要があります。または、userLock.getOwner(); を使用することもできます。.lock() のすぐ後ろで、どのスレッドがロックされたかを確認します。

于 2013-08-22T13:39:02.473 に答える