《java多线程编程核心技术》核心笔记(三) Lock的使用

【Lock】




Lock lock = new ReentrantLock();


lock.lock()就是持有了对象监视器 其他线程只有等待锁的释放。


在使用notify()/notifyAll()方法进行通知时,被通知的线程是由JVM随机选择的,但是使用了
ReentrantLock结合Condition类是可以实现"选择性通知"的, 在Condition类中是默认提供的。
而synchronized就相当于Lock对象中的单一Condition对象,所有的线程都注册在它一个对象的身上
线程开始notifyAll()时,需要通知所有的waiting的线程 没有选择权 会出现相当大的效率问题。


在调用condition.await()方法之前需要调用lock.lock()方法.否则会出现IllegalMonitorStateException


Object.wait相当于Condition.await方法  Object.notify相当于Condition.signal/signalAll()方法


如果想单独唤醒部分线程,就需要使用多个Condition对象,也就是Condition对象可以唤醒部分指定线程,有助于
提升程序的运行效率。可以先对线程进行分组,然后唤醒指定组中的线程。


公平锁与非公平锁 ReentrantLock(true/false)的区别是 公平锁是先来的先得到锁。


getHoldCount()获得lock的数量。


getQueueLength()的作用是返回证等待获取此锁定线程估计数.


int getWaitQueueLength(Condition condition)的所用是返回等待与此锁定相关条件Condition线程估计数量。


boolean hasQyeyedThread(Thread thread)的作用是查询指定的线程是否正在等待获取此锁定。


boolean hasWaiters(Condition condition)作用是查询是否有线程正在等待与此锁定的condition条件. 


boolean isFair判断是不是公平锁。


boolean isHeldByCurrentThread() 查询当前线程是否保持此锁定.


boolean isLocked() 查询此锁是否由任意线程保持。


boolean tryLock(long timeout, TimeUnit unit)作用是如果锁定在给定等待时间内没有被另外一个线程保持,
且当前线程不中断,则获取该锁定。


awaitUntil(Date) Date之前可以被其他线程唤醒.


类ReentrantLock具有完全互斥排他的效果,即同一时间只有一个线程在执行任务。这样虽然保证了安全 但是效率较低
所以提供了ReentrantReadWriteLock类使用它可以加快运行效率,在某些不需要操作的实例变量的方法中完全可以使用

读写锁来加快代码的运行速度.


有不懂的加我微信 18221051908

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值