重点: ReentrantLock类 ReentrantReadWriteLock类

java.until.concurrent.locks.Condition;
java.until.concurrent.locks.ReentrantLock;

4.1 ReentrantLock 实现同步

Lock lock=new ReentrantLock()
lock.lock();
lock.unlock();

使用 Condition实现等待/通知

notify() 与 Condition类通知,后者灵活性更好,多路通知功能,前者是JVM随机选择通知激活

Condition condition=lock.newCondition()
// 等待
lock.lock();
condition.await(); // 必须先调用lock.lock() 获取同步监视器

// 通知
lock.lock();
conditon.singnal();

Object类中的方法与Condition类中的方法对比:
wait await
wait(long timeout) await(long time,TimeUnit unit)
notify() signal()
notifyAll() signalAll()

多个Condition对象实现通知部分线程

实现生产者/消费者模式:
一对一交替打印
set(){
lock.lock();
while(hasValue===true){
condition.await();
}
hasValue=true;
condition.signal();
}
lock.unlock();

get(){
lock.lock();
while(hasValue===false){
condition.await();
}
hasValue=false;
condition.signal();
}
lock.unlock();

  1. 多对多交替打印<br />MyThreadA[10] threadA=new MyThreadA[10]<br />MyThreadB[10] threadB=new MyThreadB[10]<br />condition.signalAll();解决假死问题

公平锁与非公平锁

公平锁:Lock lock=new ReentrantLock(true);
先start的先获取锁

非公平锁:Lock lock=new ReentrantLock(false);
先start的不一定先获取锁

// 调用lock方法的次数,即当前线程保持此锁定的个数
lock.getHoldCount();
// 返回正等待获取此锁定线程估计数
lock.getQueueLength();
// 返回等待与此锁定相关的给定条件Condition的线程估计数
getWaitQueueLength(Condition condition)

4.2 使用ReentrantReadWriteLock类

读写锁:共享锁、排它锁

ReentrantReadWriteLock lock=new ReentrantReadWriteLock();

读读共享
lock.readLock().lock();
lock.readLock().unlock();
写写互斥
lock.writeLock.lock();
lock.writeLock.unlock();

读写互斥、写读互斥

4.3总结

Lock对象替换synchronize
并发包中大量类使用Lock接口作为同步的处理方式