ReentrantLock l = new ReentrantLock(true);
Reader[] readers = new Reader[2];
for (int i = 0; i < readers.length; i++) {
readers[i] = new Reader(l);
}
for (int i = 0; i < readers.length; i++) {
readers[i].start();
}
public class Reader extends Thread {
private ReentrantLock l;
public Reader(ReentrantLock l) {
this.l = l;
}
@Override
public void run() {
try {
l.tryLock();
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " i = " + i);
Thread.sleep(500);
}
// l.unlock(); // although it commented the code not hanged why?
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}根据我对tryLock()的理解,如果锁不是由另一个线程持有,则获取锁并立即返回。在我的例子中,我有两个线程假设thread_0 get lock现在我有两个问题: Q1:为什么thread_1在l.tryLock()之后仍然进入临界区它不是被thread_0锁定的吗;Q2:它不是假设我的代码因为thread_0没有释放锁而被挂起吗#谢谢提前
发布于 2021-10-18 21:23:39
您的代码正在进入临界区,因为tryLock()不是阻塞函数,它将立即返回true或false,并继续下面的“临界区”代码片段。
在tryLock()的文档中,您可以阅读
如果锁由另一个线程持有,则此方法将立即返回值false。
因此,您需要调用lock()方法,该方法会一直等待,直到另一个读取器释放锁。
https://stackoverflow.com/questions/69622603
复制相似问题