ReentrantLock.tryLock()是如何工作的,因为从源代码看它不使用synchronized块或函数

时间:2018-05-24 18:23:04

标签: java multithreading nonblocking reentrantlock

当我在我的一个项目中使用tryLock()方法时,使用相同的问题时,引人注目的问题是 - tryLock()被认为是非阻塞机制,它是如何设法的得到一个没有阻止的锁。

可以有两种情况

  1. 内部没有使用synchronized块/方法,那么问题是,它在多线程环境中如何工作
  2. 内部使用synchronized块/方法,问题是,如何阻止
  3. 为了找到答案,我检查了tryLock

    的以下代码
    public boolean tryLock() {
        return sync.nonfairTryAcquire(1);
    }
    

    这里有sync.nonfairTryAcquire(1)的代码,它实际上完成了工作

     final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }
    

    由于似乎tryLock()的代码在任何地方都没有使用synchronized它在多线程环境中如何运作?

1 个答案:

答案 0 :(得分:0)

  

如何设置锁定而不阻塞?

总是获得锁定。这就是重点:当lock.tryLock()阻止来电者时,lock.lock()可能会失败。

  

它不使用同步块或函数

那会破坏目的。由于任何原因,要阻止。

我不熟悉该代码,但看起来实际上是在compareAndSetState(0, acquires)中获取(或不是)锁。可能在它的核心某处有Compare and Set硬件指令。

FWIW,AtomicInteger.compareAndSet(...)功能非常相似。