lock.tryLock()为什么会让线程阻塞

package com.tianxuan.medical.service.impl;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TestLock {
    private Lock lock = new ReentrantLock();
    //需要参与同步的方法
    private void method(Thread thread){
        lock.lock();
        try {
            System.out.println(lock.tryLock());
            System.out.println("线程名"+thread.getName() + "获得了锁");
        }catch(Exception e){
            e.printStackTrace();
        } finally {
            System.out.println("线程名"+thread.getName() + "释放了锁");
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        TestLock lockTest = new TestLock();
        //线程1
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                lockTest.method(Thread.currentThread());
            }
        }, "t1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                lockTest.method(Thread.currentThread());
            }
        }, "t2");

        t1.start();
        t2.start();
    }
}
//输出结果

//true
//线程名t1获得了锁
//线程名t1释放了锁

然后注掉tryLock(),输出结果为
线程名t1获得了锁
线程名t1释放了锁
线程名t2获得了锁
线程名t2释放了锁

 

tryLock()为什么会造成线程2的阻塞

 

同学你好,当你线程T1执行完整个流程,其实共享变量state是1。这个时候T2去获取锁,compareAndSetState方法的时候会失败,因为只有当0的时候才能成功。
下面来详细讲解一下:
T1走lock方法的时候,state为1,当走tryLock方法的时候因为是重入锁所以state变为2,当走unlock的时候减一,变为1.
源码分析tryLock:

img

可以发现当current == getExclusiveOwnerThread()时,state加1.
源码分析lock

img

可以看到T2进来compareAndSetState将失败,进入acquire方法,尝试获取锁,获取不到会进入队列,一直等待下去

img

看源码

img

了解下cas,

tryLock() 不会阻塞,它只尝试获取一下,没获取到就算了;