当前位置: 首页 > wzjs >正文

想在百度做网站成人培训机构

想在百度做网站,成人培训机构,web前端开发流程图,注册网站要多少钱本章我们继续AQS的源码解析,ReentrantLock本身是重入锁,之前解析了很多关于ReentrantLock的源码但是可重入锁这部分却没有谈及接下来讲一下重入锁是如何实现的。 可重入锁: 对于ReentrantLock的可重入锁的具体实现逻辑是在tryAcquire这个方…

本章我们继续AQS的源码解析,ReentrantLock本身是重入锁,之前解析了很多关于ReentrantLock的源码但是可重入锁这部分却没有谈及接下来讲一下重入锁是如何实现的。

可重入锁:

对于ReentrantLock的可重入锁的具体实现逻辑是在tryAcquire这个方法中实现的,本身AQS是没有这个方法的具体业务逻辑的交给子类去实现的而ReentrantLock中的Sync继承了AQS并且去实现了tryAcquire,在tryAcquire方法中定义了如何处理重入锁的逻辑。

 protected final boolean tryAcquire(int var1) {Thread var2 = Thread.currentThread();int var3 = this.getState();if (var3 == 0) {if (!this.hasQueuedPredecessors() && this.compareAndSetState(0, var1)) {this.setExclusiveOwnerThread(var2);return true;}} else if (var2 == this.getExclusiveOwnerThread()) {int var4 = var3 + var1;if (var4 < 0) {throw new Error("Maximum lock count exceeded");}this.setState(var4);return true;}return false;}

两个if条件判断分别是判断锁是否被占用,然后判断当前线程持有锁线程是否为本线程。

第一个判断的内部逻辑主要是公平锁校验的(这个后续会说),第二个则是可重入锁判定的

getExclusiveOwnerThread方法返回值是当前持有锁的线程对象,与本线程对象进行比对如果是同一个对象则证明当前是重入锁逻辑操作将state状态变量进行加一。

可以看出每次重入锁的时候都会将state同步量加一,这样就能对其锁的重入次数进行技术,那么每次释放锁的时候都会进行减一直到最后为0的时候才会真正的释放锁。顺带我们看一下释放锁的过程。释放锁则是tryRelease方法来实现的。

  protected final boolean tryRelease(int var1) {int var2 = this.getState() - var1;if (Thread.currentThread() != this.getExclusiveOwnerThread()) {throw new IllegalMonitorStateException();} else {boolean var3 = false;if (var2 == 0) {var3 = true;this.setExclusiveOwnerThread((Thread)null);}this.setState(var2);return var3;}}

首先将状态值扣减,并且进行判断如果状态值为0则释放锁,将当前持有锁的线程置为null,然后设置状态值,最后返回boolean类型值表示是否完成了锁释放。

公平锁和非公平锁:

如果一个锁是公平的那么获取资源的顺序就应该满足FIFO队列中的顺序,否则则不为公平锁。公平锁能尽可能的减少线程饥饿,但是相比于非公平锁的性能则会差不少。

前面代码中hasQueuedPredecessors则是公平锁的校验代码

    public final boolean hasQueuedPredecessors() {Node var1 = this.tail;Node var2 = this.head;Node var3;return var2 != var1 && ((var3 = var2.next) == null || var3.thread != Thread.currentThread());}

主要业务逻辑是查看是否队列前面是否有其他线程在等待,如果有则返回false,借此来进行公平锁校验

对于非公平锁则是通过nonfairTryAcquire来进行

final boolean nonfairTryAcquire(int var1) {Thread var2 = Thread.currentThread();int var3 = this.getState();if (var3 == 0) {if (this.compareAndSetState(0, var1)) {this.setExclusiveOwnerThread(var2);return true;}} else if (var2 == this.getExclusiveOwnerThread()) {int var4 = var3 + var1;if (var4 < 0) {throw new Error("Maximum lock count exceeded");}this.setState(var4);return true;}return false;}

可以看出非公平锁与公平锁的区别就在于当判断到资源没有被占用的时候,公平锁则是再判断一下是否该到自己了,而非公平锁则是直接进行CAS占有锁操作。

对于ReentrantLock来说默认是非公平锁。

下一章节我们将来介绍LockSupport阻塞线程工具类,以及Condition基于等待队列的线程唤醒与等待工具类

http://www.dtcms.com/wzjs/299637.html

相关文章:

  • 绘制网站结构图职业培训机构哪家最好
  • 做外贸的阿里巴巴网站是哪个好制作网站软件
  • wordpress文本自动分页seo常用分析的专业工具
  • 郑州网站建设 推广我赢网客服系统
  • 网站建设用哪种语言好凡科建站官网入口
  • 网站建设常见问题及解决办法网站权重排名
  • 网站建设要点广州seo诊断
  • 网站模板上传教程视频教程在线服务器网站
  • 秦皇岛做网站seo的有什么推广的平台
  • 团购网站 模板福州短视频seo机会
  • 怎么做网站评论seo关键词优化的技巧
  • 官方网站建设维护合作协议企业培训系统app
  • 宜春建设网站公司如何优化搜索引擎的搜索功能
  • 如何自己搭建一个企业网站seo排名外包
  • 电子商务企业网站建设规划方案网站关键词优化工具
  • 高端h5网站开发网站seo收录工具
  • 做网站主要学什么软件南宁百度seo推广
  • 上国外网站用什么机箱好手机端搜索引擎排名
  • 日本网站图片做淘宝代购百度top排行榜
  • 男女做的那个视频网站怎么网络推广
  • 自己做网站如何销售seo关键词是怎么优化的
  • 做黄色网站赚钱么营销的手段和方法
  • html5黑色网站下载百度软件
  • 网站建设公司创业宁波优化网站排名软件
  • 济南市住房建设网站女生学电子商务后悔了
  • 长兴网站建设公司正规的微信推广平台
  • 武汉快递最新消息谷歌seo博客
  • 手机在线做ppt的网站ciliba磁力猫
  • 销售行业怎样做网站营销策划书格式及范文
  • 房屋装修设计网站成品网站建站空间