6、锁

1 篇文章 0 订阅

9.1锁

在java多线程中,我们知道可以使用synronized关键字来实现线程间的同步互斥工作,那么其实还有一个更优秀的机制去完成这个"同步互斥"工作,他就是Lock对象,我们主要学习两种锁,重入锁和读写锁。他们具有比 synchronized 更为强大的功能,并且有嗅探锁定、多路分支等功能。

  

9.2 ReentrantLock(重入锁)

重入锁,在需要进行同步的代码部分加上锁定,但不要忘记最后一定要释放锁定,不然会造成锁永远无法释放,其他线程永远进不来的结果。

  

9.3 锁与等待/通知

还记得我们在使用synchronized的时候,如果需要多线程间进行协作工作则需要Objectwait()notify()、notifyAll() 方法进行配合工作·

那么同样,我们在使用Lock的时候,可以使用一个新的等待/通知的类,它就

Condition。这个Condition一定是针对具体某一把锁的。也就是在只有锁的基础之上才会产生Condition

condition.await(); = Object.wait(); condition.signal(); = Object.notify(); signal()方法不释放锁

  

我们可以通过一个Lock对象产生多个Condition进行多线程间的交互,非常的灵活。可以使得部分需要唤醒的线程唤醒,其他线程则继续等待通知。

  

  

  

9.5 Lock/Condition其他方法和用法。

公平锁和非公平锁:

Lock lock = new ReentrantLock(boolean isFair);

Lock 用法:

tryLock():尝试获得锁,获得结果用true/false返回。

tryLock(long time, TimeUnit unit):在给定的时间内尝试获得锁,获得结果用true/false返回

isFair():是否是公平锁。

isLocked():是否锁定。

getHoldCount():查询当前线程保持此锁的个数,也就是调用lock()次数。

locklnterruptibty():优先响应中断的锁·

getQueueLeng():返回正在等待获取此锁定的线程数。

getWaitQueueLength():返回等待与锁定相关的给定条件Condition的线程数。

hasQueuedThread(Thread thread):查询指定的线程是否正在等待此锁。

hasQueuedThreads():查询是否有线程正在等待此锁·

hasWaiters():查询是否有线程正在等待与此锁定有关的Condition条件·

  

  

9.6 ReentrantReadWriteLock(读写锁)

读写锁ReentrantReadWriteLock,其核心就是实现读写分离的锁。在高并发访问下,尤其是读多写少的情况下,性能要远高于重入锁。之前学synchronizedReentrantLock时,我们知道,同一时间内,只能有一个线程进行访问被锁定的代码,那么读写锁则不同,其本质是分成两个锁,即读锁、写锁。在读锁下,多个线程可以并发的进行访问,但是在写锁的时候,只能一个一个的顺序访问。

囗诀:读读共享,写写互斥,读写互斥。

  

9.7 锁优化总结

1 避免死锁

2 减小锁的持有时间

3 减小锁的粒度

4 锁的分离

5 尽量使用无锁的操作,如原子操作(Atomic系列类), volatile 关键字

  

  

 

  

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值