文章字数:372,阅读全文大约需要1分钟
Lock接口是语言层面的锁
一、 常用方法
lock()加锁lockInterruptibly()可中断获取锁的过程unlock()释放锁tryLock()尝试获取锁tryLock(long, TimeUnit)可设置获取锁超时
二、对比synchronized
- 不可中断
- 不可超时
synchronized更简洁- 需要锁中断、超时、尝试的时候使用
Lock锁,其他尽量使用synchronized
三、可重入锁
synchronized是隐式可重入锁ReentrantLock是Lock的可重入锁实现类,相当于synchronized的代码层实现
四、公平和非公平锁
- 公平锁,先获取先执行。
- 非公平锁,新来的执行。效率高,取消了新来的锁的状态切换过程,直接执行。
ReentrantLock(true)公平锁ReentrantLock()默认是非公平锁
五、读写锁
- 排它锁,
synchronized和ReentrantLock都是排它锁,只允许一个线程获取数据。 - 读写锁,维护读和写两个锁。适用于读多写少的操作。
ReadWriteLock接口下的ReentrantReadWriteLockgetlock = readWriteLock.readLock()获取读锁,getlock.lock()setlock = readWriteLock.writeLock()获取写锁,getlock.lock()
锁的一般用法1
2
3
4
5
6lock.lock();
try{
//...
} finally {
lock.unlock();
}
六、Condition接口
- 实现线程唤醒(通知)功能
- 每个锁的实现都有
getCondition方法可以获取,一个锁可以多个
6.1使用
1 | lock.lock(); |
1 | lock.lock(); |