java 多线程核心技术 第四章 lock的使用

来源:互联网 发布:打车软件 数据 编辑:程序博客网 时间:2024/06/06 20:17
1.使用ReentrantLock类
jdk1.5 新加 ReentrantLock 比synchronized更加灵活
lock.lock 获得对象锁
lock.unlock释放锁

lock 中实现wait notify 的功能 需要借助Condition对象
Condition 也是jdk1.5 出现的 可以实现多路通知 也就是在一个lock对象中可以创建多个condition 这个condiion就相当于是对象监视器,线程对象注册在指定的condition中,从而可以有选择性的进行线程的通知,在调度上更加的灵活。
lock.newCondition 创建一个condition对象
condition 的 await 方法 必须在lock.lock执行后 相当于是object类中的wait方法
Object Condition
wait await
notigy signal
notifyAll signalAll
借助condition的方法可以更方便的实现生产者消费者模式
其实这个condition就是对象监视器

公平锁和非公平锁
new ReentrantLock(boolean) true为公平锁 false为非公平锁
公平就是 FIFO策略先到先得 非公平锁是一种抢占策略
默认情况下使用的是非公平锁
方法
getHoldCount 查询当前线程调用了多少次lock方法
getQueueLength 返回正等待获取此锁定的线程估计数
getWaitQueueLength(condition) 返回等待与此锁定相关的给定条件Condition的线程估计数
hasQueuedThread(thread) 查询指定的线程是否正在等待获取此锁定
hasQueuedThreads 查询是否有线程正在等待获取此锁定
hasWaiters(condition) 查询是否有线程正在等待与此锁定有关的condition条件
isFari() 判断是否是公平锁
isHeldByCurrentThread() 当前线程是否保持锁定
isLocked() 查询此锁定是否由任意线程保持
lockInterruptibly 当线程未被中断则获取锁定 ,如果已经被中断则出现异常
tryLock() 仅在调用时锁定未被另一个线程保持的情况下,才获取该锁定
tryLock(long timeout,TimeUnit unit) 如果锁定在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁定
awaitUninterruptibly() 碰到中断就一直等待
awaitUntil(long) 等待一段时间 在等待时间内可以被其他线程唤醒

2. ReentrantReadWriteLock 读写锁
读写锁 有两个锁,一个是读相关的锁也称共享锁,另一个是写相关的锁也叫排他锁
读锁之间不互斥,读写互斥,写写互斥
lock.readLock.lock() 读锁
lock.writeLock.lock() 写锁

原创粉丝点击