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:
可以发现当current == getExclusiveOwnerThread()时,state加1.
源码分析lock
可以看到T2进来compareAndSetState将失败,进入acquire方法,尝试获取锁,获取不到会进入队列,一直等待下去
看源码
了解下cas,
tryLock() 不会阻塞,它只尝试获取一下,没获取到就算了;