这是自定义锁定机制的一个很好的实现吗?

时间:2016-09-06 12:55:52

标签: java multithreading

我有一个需要实现锁定机制的任务。这就是我到目前为止所拥有的。基本上我需要lock方法来尝试获取一个锁,如果获得了锁则返回true,否则返回false。尝试释放锁定的unlock方法,如果成功则返回true,否则返回false。

这是实现这个的正确方法,还是可以这样做?可以对此代码添加哪些改进,或者以何种方式对其进行修改?

提前致谢,

安德烈

private Long threadId;

private int lockHolds;

public synchronized boolean lock(long waitTime) throws DataStoreException {
    if (lockHolds == 0) {
        doLock(waitTime);
        return true;
    }

    return false;
}

private synchronized void doLock(long waitTime) throws DataStoreException {
    if (lockHolds == 0) {
        lockHolds++;
        this.threadId = Thread.currentThread().getId();
    } else if (lockHolds > 0 && this.threadId == Thread.currentThread().getId()) {
        lockHolds++;
    } else {
        try {
            wait(waitTime);
            lockHolds++;
            this.threadId = Thread.currentThread().getId();
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        }
    }

}

public synchronized boolean unlock() {
    if (lockHolds == 0) {
        return false;
    }

    lockHolds--;

    if (lockHolds == 0) {
        notify();
        return true;
    }

    return false;
}

1 个答案:

答案 0 :(得分:4)

  1. 这是错误的:

    wait(waitTime);
    lockHolds++;
    this.threadId = Thread.currentThread().getId();
    
  2. 你只需等待它,然后从当前拥有的线程中窃取锁定。该线程可能位于其关键部分的中间,因此您允许并发访问关键部分。

    1. wait必须始终用于重复测试等待条件的循环中,以防止虚假唤醒。

    2. lock()方法仅检查lockHolds变量,如果它不为零则拒绝继续,从而防止锁的重入行为。

    3. 您的unlock方法错误,因为任何线程都可以调用它并释放另一个线程的锁。

    4. 虽然我不熟悉您的要求,但对我来说,请求自定义锁实现但允许它依赖于内置锁实现和内置等待通知机制将是非常奇怪的。但那部分取决于你。