首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java ReentrantLock tryLock()误解

java ReentrantLock tryLock()误解
EN

Stack Overflow用户
提问于 2021-10-18 21:08:54
回答 1查看 90关注 0票数 0
代码语言:javascript
复制
    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没有释放锁而被挂起吗#谢谢提前

EN

回答 1

Stack Overflow用户

发布于 2021-10-18 21:23:39

您的代码正在进入临界区,因为tryLock()不是阻塞函数,它将立即返回true或false,并继续下面的“临界区”代码片段。

在tryLock()的文档中,您可以阅读

如果锁由另一个线程持有,则此方法将立即返回值false。

因此,您需要调用lock()方法,该方法会一直等待,直到另一个读取器释放锁。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69622603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档