【发布时间】:2016-09-06 12:55:51
【问题描述】:
我有一个需要实现锁定机制的任务。这就是我到目前为止所拥有的。基本上我需要 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;
}
【问题讨论】:
-
使用
synchronized实现锁定有点弄巧成拙,不是吗? -
CodeReview (codereview.stackexchange.com) 比 Stackoverflow 更适合工作代码的审查。
-
为什么不使用 ReentrantLock 作为要测试的锁并删除同步关键字。
标签: java multithreading