Java层面实现的锁 VS JVM实现的锁
2022-02-28 本文已影响0人
M_lear
JVM实现的锁,对应synchronized关键字。
Java层面实现的锁,对应为Lock接口和ReadWriteLock接口的实现类。
Lock接口:
public interface Lock {
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
}
ReadWriteLock接口:
// 读读共享,读写互斥,写写互斥
public interface ReadWriteLock {
Lock readLock();
// 写锁保证修改对读锁可见
Lock writeLock();
}
区别
Java层面实现的锁更加灵活:
- 线程阻塞在获取lock上时,允许被中断,退出阻塞状态,并抛出InterruptedException。(lockInterruptibly())
- 尝试性的tryLock,而不阻塞线程。
- 或者,限时阻塞的tryLock,同样允许被中断,退出阻塞状态,并抛出InterruptedException。
- 支持多个等待条件。
- 支持读写锁。
题外话:Java中断
线程的中断标志为true,可以让处于WAITING或TIMED_WAITING的阻塞线程,从阻塞状态中退出来。
但对于处于BLOCKED的阻塞线程,没有效果。
- WAITING状态
线程阻塞在,等待另一个线程的某个动作发生。
wait、join、park
- TIMED_WAITING状态
sleep、限时wait、限时join和限时park。
- BLOCKED状态
线程阻塞在,获取synchronized锁上。
【AQS的,线程阻塞和唤醒,最终都是基于Unsafe的park和unpark实现的。】