Java非重入锁实现
我实现了一个不可重入的锁。我想知道这是否有任何错误、竞争条件等。我知道必须使用现有库(而不是编写我们自己的库),但这只是为了看看我是否正确理解java并发性。任何反馈都将不胜感激Java非重入锁实现,java,concurrency,synchronization,locking,mutex,Java,Concurrency,Synchronization,Locking,Mutex,我实现了一个不可重入的锁。我想知道这是否有任何错误、竞争条件等。我知道必须使用现有库(而不是编写我们自己的库),但这只是为了看看我是否正确理解java并发性。任何反馈都将不胜感激 public class MyLock { private boolean isLocked = false; private long owner = -1; private static String TAG = "MyLock: "; public synchronized void Lock() throws
public class MyLock {
private boolean isLocked = false;
private long owner = -1;
private static String TAG = "MyLock: ";
public synchronized void Lock() throws InterruptedException, IllegalStateException {
if(!isLocked) {
isLocked = true;
owner = Thread.currentThread().getId();
} else {
if(owner == Thread.currentThread().getId()) {
throw new IllegalStateException("Lock already acquired. " +
"This lock is not reentrant");
} else {
while(isLocked == true) {
System.out.println(TAG+"Waiting for Lock, Tid = " +
Thread.currentThread().getId());
wait();
}
}
}
System.out.println(TAG+"Lock Acquired: Owner = " + owner);
}
public synchronized void Unlock() throws IllegalStateException {
if(!isLocked || owner != Thread.currentThread().getId()) {
throw new IllegalStateException("Only Owner can Unlock the lock");
} else {
System.out.println(TAG+"Unlocking: Owner = " + owner);
owner = -1;
isLocked = false;
notify();
}
}
}这里是Java中“标准”/“不可重入”锁的一个实现,作为Java内置重入锁的包装,它可以简单地防止多次获取锁
/**
* A "non-reentrant" lock, implemented as a wrapper around Java's ReentrantLock.
*
*/
class StandardLock implements java.util.concurrent.locks.Lock {
public static class LockAlreadyHeldException extends RuntimeException {}
private final java.util.concurrent.locks.ReentrantLock mainLock;
private void checkNotAlreadyHeld() {
if (mainLock.getHoldCount()!=0) {
throw new LockAlreadyHeldException();
}
}
public StandardLock() {
mainLock=new java.util.concurrent.locks.ReentrantLock();
}
public StandardLock(boolean fair) {
mainLock=new java.util.concurrent.locks.ReentrantLock(fair);
}
@Override
public void lock() {
checkNotAlreadyHeld();
mainLock.lock();
}
@Override
public void lockInterruptibly() throws InterruptedException {
checkNotAlreadyHeld();
mainLock.lockInterruptibly();
}
@Override
public boolean tryLock() {
checkNotAlreadyHeld();
return mainLock.tryLock();
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
checkNotAlreadyHeld();
return mainLock.tryLock(time, unit);
}
@Override
public void unlock() {
mainLock.unlock();
}
@Override
public Condition newCondition() {
return mainLock.newCondition();
}
}
这种方法的优点是,该类实现了Java的锁接口,因此条件变量随附,以允许创建监控器。为了充分利用锁进行并发编程,监视器非常重要。经过深思熟虑后,决定使用锁。不建议仅仅为了执行而执行
非可转置
锁定?你的思维过程是什么?你为什么需要这样的东西?@DarrylMiles:有没有办法把它转移到codereview?或者我应该在codereview中创建另一篇帖子。@AmitD:对rentrant锁和不可重入锁进行了很好的讨论。下面是一个简单的评论:Thread.currentThread().getId()
除了监视/记录之外,对任何事情都没有用处(或者用JMX查询信息,实际上只对监视/记录有用)。删除getId()并使用线程本身。提示:getId()
可以被覆盖。这是如何回答问题的?