简介
既然有了synchronized,为啥还要提供Lock接口呢?
也许你会说Lock接口比synchronized性能高。在jdk1.5之前确实如此,但是在jdk1.6之后,通过对synchronized的优化后,两者性能差不多了。
Lock接口
直接来看Lock接口的定义,Lock接口提供一系列的基础函数
// 获取锁,获取不到lock就不罢休,不可被打断,即使当前线程被中断,线程也一直阻塞,直到拿到锁。
void lock();
/**
* 获取锁,可中断,如果获取锁之前当前线程被打断interrupt了,
* 获取锁之后会抛出InterruptedException,并且停止当前线程;
* 优先响应中断
*/
void lockInterruptibly() throws InterruptedException;
// 立即返回结果;尝试获得锁,如果获得锁立即返回ture,失败立即返回false
boolean tryLock();
// 尝试拿锁,可设置超时时间,超时返回false,即过时不候
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 释放锁
void unlock();
// 定义条件,返回当前线程的Condition,可多次调用
Condition newCondition();
synchronized和ReentrantLock的异同
1、ReentrantLock支持非阻塞的方式获取锁,能够响应中断,而synchronized不行
2、ReentrantLock必须手动获取和释放锁,而synchronized不需要
3、ReentrantLock可以是公平锁或者非公平锁,而synchronized只能是非公平锁
4、synchronized在发生异常的时候,会自动释放线程占有的锁,而ReentrantLock在发生异常时,如果没有通过unlock去释放锁,很有可能造成死锁,因此需要在finally块中释放锁
5、synchronized和ReentrantLock都是可重入锁