繁体   English   中英

java ReentrantLock tryLock() 误区

[英]java ReentrantLock tryLock() misunderstanding

    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 现在获得锁我有两个问题: Q1:为什么 thread_1 之后仍然进入临界区l.tryLock() 是不是被thread_0锁了; Q2:是不是我的代码会被挂起,因为 thread_0 没有释放锁#thanks Advance

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

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

如果锁被另一个线程持有,那么这个方法将立即返回 false 值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM