我的ReentrantLock不像我期望的那样工作。我期望下面代码的结果是随机锁定和解锁两个线程,但是我得到的结果总是在一个线程上解锁。有人能解释一下ReentrantLock吗?我正试图理解它的公平性策略(即新的ReentrantLock(true))和tryLock()方法。谢谢。
final ReentrantLock lock = new ReentrantLock(true);
new Thread(new Runnable() {
@Override
public void run() {
while (true)
try{
if (lock.tryLock(1, TimeUnit.SECONDS)) {
lock.lock();
System.out.println(Thread.currentThread().getName() + " locked");
lock.unlock();
} else {
System.out.println(Thread.currentThread().getName() + " not locked");
}
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true)
try{
if (lock.tryLock(1, TimeUnit.SECONDS)) {
lock.lock();
System.out.println(Thread.currentThread().getName() + " locked");
lock.unlock();
} else {
System.out.println(Thread.currentThread().getName() + " not locked");
}
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
控制台的结果:
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
Thread-1 not locked
Thread-0 locked
发布于 2021-12-12 06:12:05
你的用法坏了。您可以调用tryLock
,它可能锁定也可能不锁(它返回的布尔值告诉您发生了什么)。
如果lock()
工作正常,您可以立即将称为第二次,这很好,因为它是一个可重入的锁,但是现在您还需要调用unlock()
两次,而不是这样做的。对lock()
的每一次呼叫和对** tryLock
的每一次调用都必须伴随着 unlock()
调用。
因此,无论哪个线程赢得了竞赛,都不会释放锁,因为您没有匹配您的锁调用。
考虑到您必须解锁,实际上只有一种方法可以使用锁定:
someLock.lock();
try {
do stuff here
} finally {
someLock.unlock();
}
以及使用tryLock
if (someLock.tryLock()) try {
code goes here
} finally {
someLock.unlock();
} else {
code here if lock was not available
}
如果您的锁调用没有紧接着关键字try
,那么您的代码就会中断。注意,锁类的javadoc提到了这一点,并在所有相关示例中都显示了这一点。ReentrantLock
javadoc -它就在上面。
https://stackoverflow.com/questions/70320992
复制相似问题