重点: 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();
多对多交替打印<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接口作为同步的处理方式