4,锁

内容提要
• 用ReentrantLock控制业务层面的并发;

• 进一步理解可重入特性;

• 公平锁和非公平锁的使用场景;

• 读写锁的使用场景;

• 在面试中介绍锁的相关说辞;

ReentrantLock控制业务层面的并发
• 在账户类里,加入ReentrantLock锁 ;

• 登录,登出,存钱和取钱等方法上,无需加synchronized关键字;


ReentrantLock控制业务层面的并发

• 登录操作前,先锁账户,登出后,释放锁
• acc是AccountWithLock的实例


可重入锁 

• 也叫可递归锁, synchronized和ReentrantLock ;

• 同一个线程再次进入同步代码时,可以使用自己已获取到的锁;

• 同一线程多次获取同一把锁时,防止死锁发生 ;

• 结合场景说明:比如某数据库的操作的线程需要多次调用被锁管理 的“获取数据库连接”的方法,如使用可重入锁就能避免死锁。反之,在第二次调用“获取数据库连接”方法时,就有可能被锁住。

公平锁和非公平锁 

• 公平锁会维护一个等待队列,多个在阻塞状态等待的线程会被插入 该等待队列,在调度时是按它们所发请求的时间顺序获取锁;

• 未必需要保证先来先服务,非公平锁会有更多的机会去抢占锁;

• 创建可重入锁时,可通过调用带布尔类型参数的构造函数来指定 该锁是否是公平锁。ReentrantLock(boolean fair);

• 非公平锁性能高于公平锁,当前线程不是队列的第一个就无法获 取锁,从而增加了线程切换次数 ;

• 如线程占用(处理)时间要远长于线程等待,那用非公平锁其实效率 并不明显,但是用公平锁会给业务增强很多的可控制性;

 

读写锁
• ReentrantReadWriteLock对象会使用两把锁来管理临界 资源,一个是读锁,另一个是写锁

• 某线程获得了资源的“读锁“, 其它读操作可以并发, 但写操作的线程会被阻塞。


• 某线程获得了某资源的“写锁“,其它任何企图获得该资源 “读锁“和“写锁“的线程都将被阻塞。

• 如果读操作的数量要远超过写操作时,那么更可以用读写锁来 让读操作可以并发执行,从而提升性能。

总结
1. 通过Lock控制业务层面并发的方式

2. 可重入锁的表现形式

3. 公平锁的使用场景

4. 读写锁的使用场景
 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值