★ 1、讲讲 Lock 锁
是一个接口,有三个实现类,分别是常用的 可重入锁,读锁、写锁
。常用的是 可重入锁 。
加锁使用lock() 方法,解锁使用 unlock() 方法。Lock的底层是 AQS+CAS机制 实现。
Lock 常用子类 可重入锁ReentrantLock 有两种模式, 公平锁模式、非公平锁模式
。
公平锁模式
和 非公平锁模式
的应用
-
默认一般创建的是 非公平锁 ,就是允许线程插队,而不是按先来后到顺序
-
并发量高的,非公平可能会导致线程饿死 === 做中间件,比如rocketmq 就需要关注锁公平和不公平
-
mq 消息队列的应用,比如网易云多个用户的评论->mq-> 如果是非公平锁,那么导致线程饥饿,导致等待时间过长-不稳定
-
解决:mq源码的queue包下有:
RoundQueue(线程不安全),ConcurrentTreeMap(线程安全-put 方法使用了lock 加锁,且 lock = new ReentrantLock(true); )
-
可重入锁的意思是 对于同一线程可以重复去获取锁。应用场景--递归,例如文件夹遍历目录下的所有文件名。