ReentrantLock 是一个可重入锁。顾名思义它可以被同一个线程重复获取,曾几何时是synchronize代替品
几个重要的方法
- lock() :获取锁
- lockInterruptibly() :获取锁优先响应中断
- tryLock() :尝试获取锁,成功返回true,失败false。该方法不等待立即返回
- tryLock(long time,TimeUnit unit) :指定时间内尝试获取锁
- unlock() :释放锁
公平锁,缺点需要维护一个队列,因此成本高,性能低下,一般情况锁是非公平的
public ReentrantLock(boolean fair) //当fair为true时,表是锁是公平的
使用公平锁线程获取是有序的,如果不使用则同一条线程会有重复获取2以上的情况
Thread-1:获取锁成功
Thread-0:获取锁成功
Thread-1:获取锁成功
Thread-0:获取锁成功
搭档Condition 它与Object.wait和Object.notify类似
- await()= Object.wait
- singal()=Object.notify
public class ReentrantLockDemo3 implements Runnable {
private static ReentrantLock lock=new ReentrantLock();
private static Condition c=lock.newCondition();
@Override
public void run() {
try {
lock.lock();
c.await();
System.out.println("!!!!!");
} catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()){
lock.unlock();
}
System.out.println(Thread.currentThread().getName()+":线程退出");
}
}
public static void main(String[] args) throws InterruptedException {
ReentrantLockDemo3 r1 = new ReentrantLockDemo3();
Thread thread = new Thread(r1);
thread.start();
Thread.sleep(5000);
//需要注意的是想要用Condition的api必须先活得锁
lock.lock();
c.signal();
//只有释放后其他线程才能重新获取锁,并继续运行
lock.unlock();
}
}