概述
- 对象锁
- 一般指synchronized,和对象有关
- 每个对象都有个隐形的监视器,用于线程的同步
- 线程状态:创建(new)->就绪(start)->运行(run)->阻塞(lock/wait/join/sleep)->销毁
- ReentrantLock
- Condition
- 实现wait,notify,notifyAll的功能
- ReadWriteLock - ReentrantReadWriteLock
ReentrantLock
- synchronized的功能增强版;JDK 1.5之前性能优于synchronized;现在性能相差不多
// 简单用法
public static ReentrantLock lock = new ReentrantLock();
try {
lock.lock();
i++;
} finally {
lock.unlock(); // 保证异常情况下也释放;synchronized由JVM释放
}
- 可重入
- 可中断
- lock.lock()
- 不能响应中断
- 在park时被中断,park会解除,设置interrupt标识,但是不抛异常,线程继续
- lock.lockInterruptibly()
- 能响应中断
- 被lock.lockInterruptibly() block的线程,收到interrupt信号时,会抛出InterruptedException,进而退出
- 可限时
- lock.tryLock(long timeout, TimeUnit unit),超时返回false
- 公平锁
- 默认非公平
- 公平
- 直接排队
- public ReentrantLock(boolean fair)
- synchronized是非公平锁
Condition
public static ReentrantLock lock = new ReentrantLock();
public static Condition condition = lock.newCondition();
- lock内部维护一个同步队列
- 同步队列头的类型是AbstractQueuedSynchronizer
- condition内部维护一个条件队列
- 条件队列头的类型为AbstractQueuedSynchronizer$ConditionObject
- 一个lock可以有多个condition,即多个条件队列
- 持锁者才可以执行await
- 因为await中有release的逻辑,会抛IllegalMonitorStateException
- co