1、锁类型
- jdk1.5之前
1、内置锁
2、volatile - jdk1.5
1、ReentrantLock
2、区别
显式锁Lock
- 无条件的(不需要有一个互斥对象)
- 可轮询,由tryLock方法实现,可避免死锁,因为会释放锁
- 定时的,由tryLock方法实现,可避免死锁,因为会释放锁
- 可中断的,在try-finally加锁模式
- 内置锁获取锁和释放锁操作都在同一个代码块,而显式锁不用,更灵活
- 公平性,线程按照请求的先后顺序来获取锁。
非公平性有一定的优势。A获取锁,B等待锁,A释放锁,B被唤醒途中,C获取锁,C运行,C释放锁,B被唤醒完成,B获取锁。
这样运行了3个线程。如果是公平的话,只运行两个线程
3、显式锁
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock r = lock.readLock();
private final Lock w = lock.writeLock();
public V put(K key, V value) {
w.lock();
try {
....
} finally {
w.unlock();
}
}
public V get(Object key) {
r.lock();
try {
....
} finally {
r.unlock();
}
}
这样避免了"读-写"和“写-写”冲突。读和读是共享的。