Java并发—ReetrantLock详解及应用

打印 上一主题 下一主题

主题 1023|帖子 1023|积分 3069

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录
一、ReetrantLock的特性
1、非阻塞获取锁
2、带超时的锁获取:
3、锁的公平性
4、锁的可停止性
5、Condition条件变量
6、锁的可重入性
可重入锁
不可重入锁
7、性能优化
二、ReentrantLock和Synchronized的区别
1、语法和使用方式
2、锁的获取和释放
3、高级特性
4、条件变量
5、性能
总结
三、ReentrantLock使用场景

之前的文章Java并发—synchronized关键字的应用-CSDN博客报告了sychronized的应用,那为什么还需要其他的锁呢?
在使用Synchronized,会存在以下几个题目:


  • 不可停止锁,需要线程实验完才会释放锁(synchronized的获取和释放锁由jvm实现)
  • 非公平锁
  • Synchronized引入了偏向锁,轻量级锁(自旋锁)后,性能有所提升
synchronized属于隐式锁,即锁的持有与释放都是隐式的,可能会导致死锁
为了可以灵活地控制锁,就需要使用到显式锁,即锁的持有和释放都必须手动编写
ReentrantLock是一把可重入锁互斥锁,它具有与 Synchronized 关键字类似的含有隐式监视器锁(monitor)的基本行为和语义,但是它比 Synchronized 具有更多的方法和功能
在Java 1.5中,官方在concurrent并发包中加入了Lock接口,ReentrantLock位于java.util.concurrent.locks包下,实现了Lock接口和Serializable接口,该接口中提供了lock()方法和unLock()方法对显式加锁和显式释放锁利用举行支持
  1.  public class ReentrantLock implements Lock, java.io.Serializable {……}
复制代码

  1. Lock lock = new ReentrantLock();
  2. public void save(){
  3.     try{
  4.         lock.lock();
  5.         //业务代码……
  6.     }finally{
  7.         lock.unlock();
  8.     }
  9. }
复制代码
从上述代码可以使用ReentrantLock来管理锁,确保在save方法实验期间对资源的独占访问。通过try-finally结构确保纵然发生异常也能精确地使用lock.unlock()释放锁 
ReentrantLock实现了Lock接口,Lock接口是Java中对锁利用行为的同一规范
ReentrantLock结构:

回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表