并发编程(六)ReentrantLock

简介: 并发编程(六)ReentrantLock

Java并发编程核心在于java.concurrent.util

juc当中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这个行为的抽象就是基于AbstractQueuedSynchronizer简称AQSAQS定义了一套多线程访问共享资源的同步器框架,是一个依赖状态(state)的同步器。

AQS具备特性

  • 阻塞等待队列
  • 共享/独占
  • 公平/非公平
  • 可重入
  • 允许中断

ReentrantLock

ReentrantLock定义了一个内部类Sync继承了AQS,通过这种方式将同步器所有调用都映射到Sync对应的方法,同时ReentrantLock也具备AQS的特性。ReentrantLock具备以下特性

  • 阻塞等待队列
  • 独占
  • 公平/非公平
  • 可重入
  • 允许中断

ReentrantLock继承关系

ReentrantLock里面定义了三个内部类SyncFairSyncNonfairSyncFairSyncNonfairSync表示公平锁与非公平锁,通过这两个内部类实现公平与非公平的机制,具体关系如下图:

Lock.png

FairSyncNonfairSync是通过继承Sync实现的,其中FairSync加锁机制为先判断列队中是否有其它线程正在等待加锁,如果有则直接入队,没有才会尝试加锁;而NonfairSync加锁机制为先进行尝试加锁,加锁失败才进行入队。

除此之外,ReentrantLock还可通过lockInterruptibly()加锁时可使用Thread.interrupt()进行中断加锁过程。

ReentrantLock加锁过程(简述)

ReentrantLock加锁详细过程

公平锁加锁过程

  1. 查看队列中是否有其它线程等待加锁
  2. 队列为空或者等待加锁的线程为当前线程,尝试CAS加锁
  3. 加锁成功 state+1,结束
  4. 加锁失败(只发生在队列为空的情况),或者队列不为空且等待加锁的线程非当前线程,进行入队。
  5. 入队完毕,将前驱结点信号量(waitStatus)改为-1,阻塞等待LockSupport.park(this)

解锁过程

  1. 解锁state-1
  2. 判断state==0(可重入锁,每次加锁state都会+1,释放锁次数必须等于加锁次数才算已解锁)
  3. 判断队列中是否有等待加锁的线程
  4. 将线程唤醒LockSupport.unpark(thread)

ReentrantLocksynchronized比较

  1. 加锁机制比较
  • ReentrantLock,基于AQS实现的锁,需要手动加锁解锁,细粒度和灵活度更高
  • synchronizedJVM内部锁,JVM会自动加锁与解锁
  1. 底层原理比较
  • 都是依赖底层操作系统的Mutex lock(互斥锁)实现
  1. 锁类型比较
  • synchronized是一种可重入的非公平锁
  • ReentrantLock是基于AQS实现,具体特性上文已有说明
  1. 性能比较(未实测)
  • 在并发量小时,synchronized性能更高一些
  • 并发量高时,synchronized性能将会下降(升级为重量级锁),而ReentrantLock基本不变。

我这里的理解是,synchronizedReentrantLock底层阻塞原理虽然是一样的,而ReentrantLock利用CAS自旋操作实现锁,能够有效避免线程从用户态到内核态的频繁切换。

目录
相关文章
|
测试技术 数据安全/隐私保护
软件测试制度-新手小白如何制定测试管理工作规范?
软件测试制度-新手小白如何制定测试管理工作规范?
595 1
|
JavaScript 安全 前端开发
TypeScript :枚举&字符&泛型
本文介绍了 TypeScript 中的泛型、约束、枚举和字符操作的基本用法。通过示例代码展示了如何定义和使用泛型函数、类和接口,以及如何利用 `keyof` 约束类型。此外,还介绍了枚举的定义和使用,包括常量枚举和外部枚举的区别。最后,简要说明了 `?.` 和 `??` 操作符的用途,帮助处理可能为空的属性和提供默认值。
260 0
|
存储 Linux Shell
Linux|Awk 变量、数字表达式和赋值运算符
Linux|Awk 变量、数字表达式和赋值运算符
|
前端开发 小程序
使用element UI-table表格列宽自适应 【已解决】
使用element UI-table表格列宽自适应 【已解决】
1467 0
|
IDE 开发工具 C++
CSP-J第二轮试题-2021/2/3年-注意事项
CSP-J第二轮试题-2021/2/3年-注意事项
|
Android开发
Eclipse中修改SVN地址
Eclipse中修改SVN地址
191 0
零基础VB教程031期:碰撞模型-案例球球大作战游戏
零基础VB教程031期:碰撞模型-案例球球大作战游戏
262 0
|
运维 监控
《ARMS助力安利搭建一体化监控运维平台》电子版地址
ARMS助力安利搭建一体化监控运维平台.ppt
415 0
《ARMS助力安利搭建一体化监控运维平台》电子版地址
|
安全
网站快照收录被劫持跳转怎么办
作为站长,因为我们做网站经常会遇到各种各类的一些困难,比如说黑客入侵,还有就是程序出错, bug和漏洞就会导致网站意想不到的损失。我做网站差不多将近5年了,这两天遇到一个事情我非常难受,我问了好多同行,别人也说不知道,大概意思就是说我们以前如果网站被入侵的话,一般都会劫持你的网站收录和跳转,他一般会搜索关键词,然后点击你的网站,然后跳转到其他的网站页面,还有很明显的就是说你的百度快照标题跟描述都被篡改了,因为它要劫持你的流量,然后导致你的核心关键词,然后排名全部掉没,所以说给网站造成很大的伤害。
364 0
网站快照收录被劫持跳转怎么办