概念
- 无锁
- 偏向锁
- 轻度锁
- 重度锁
偏向锁
轻度锁
重度锁
分类
公平锁/ 非公平锁
- 公平锁:先来后到
- 非公平锁:允许插队
Lock锁
实现类:
- ReentrantLock:默认是非公平锁
- ReadLock
- WriteLock
使用方法
Lock lock = new ReentrantLock();
public void sale(){
lock.lock();
try {
// 业务代码
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
Synchronized和Lock的区别
- Synchronized是关键字,Lock是java类
- Synchronized无法判断获取锁的状态,Lock锁可以判断释放获取到了锁
- Synchronized会自动释放锁,Lock必须手动释放锁,不释放会死锁
- Synchronized 线程1 (获得锁,阻塞)、线程2(等待,一直等待);Lock锁不一定会一直等待
- Synchronized 可重入锁,不可以中断,非公平锁;Lock可重入锁,可以判断锁,非公平(可以自己设置
- Synchronized 适合锁少了的代码同步问题,Lock适合锁大量的同步代码