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

辽宁专业模板网站建设公司django做待办事项网站

辽宁专业模板网站建设公司,django做待办事项网站,郑州app开发公司排名,杭州下沙网站建设双向链表 双向链表的特点是它有两个指针,一个指针指向前置节点,一个指针指向后继节点。所以,双向链表可以支持 常量 O(1) 时间复杂度的情况下找到前驱结点,基于这样的特点。双向链表在插入和删除操作的时候,要比单向链…

双向链表

双向链表的特点是它有两个指针,一个指针指向前置节点,一个指针指向后继节点。所以,双向链表可以支持 常量 O(1) 时间复杂度的情况下找到前驱结点,基于这样的特点。双向链表在插入和删除操作的时候,要比单向链表简单、高效。

AQS使用双向链表

因此,从双向链表的特性来看,我认为 AQS 使用双向链表有三个方面的考虑:
第一个方面,没有竞争到锁的线程加入到阻塞队列,并且阻塞等待的前提是,当前线程所在节点的前置节点是正常状态,这样设计是为了避免链表中存在异常线程导致无法唤醒后续线程的问题(如图)所以线程阻塞之前需要判断前置节点的状态,如果没有指针指向前置节点,就需要从 head 节点开始遍历,性能非常低。

第二个方面,在 Lock 接口里面有一个,lockInterruptibly()方法,这个方法表示处于锁阻塞的线程允许被中断。也就是说,没有竞争到锁的线程加入到同步队列等待以后,是允许外部线程通过interrupt()方法触发唤醒并中断的。这个时候,被中断的线程的状态会修改成 CANCELLED。(如图)被标记为 CANCELLED 状态的线程,是不需要去竞争锁的,但是它仍然存在于双向链表里面。意味着在后续的锁竞争中,需要把这个节点从链表里面移除,否则会导致锁阻塞的线程无法被正常唤醒。在这种情况下,如果是单向链表,就需要从 Head 节点开始往下逐个遍历,找到并移除异常状态的节点。同样效率也比较低,还会导致锁唤醒的操作和遍历操作之间的竞争

第三个方面,为了避免线程阻塞和唤醒的开销,所以刚加入到链表的线程,首先会通过自旋的方式尝试去竞争锁。但是实际上按照公平锁的设计,只有头节点的下一个节点才有必要去竞争锁,后续的节点竞争锁的意义不大。否则,就会造成羊群效应,也就是大量的线程在阻塞之前尝试去竞争锁带来比较大的性能开销。所以,(如图)为了避免这个问题,加入到链表中的节点在尝试竞争锁之前,需要判断前置节点是不是头节点,如果不是头节点,就没必要再去触发锁竞争的动作。所以这里会涉及到前置节点的查找,如果是单向链表,那么这个功能的实现会非常复杂。

http://www.yayakq.cn/news/310565/

相关文章:

  • 阿里巴巴黄页网站wordpress 网络图片
  • 潍坊比较大的网站制作公司建一个网站带管理需要多少钱一年
  • wordpress 网站打不开青岛李沧网站建设
  • 通辽大柒网站建设有限公司匿名网站建设
  • 在线网页游戏网站网站建设ui设计
  • 什么网站可以做宣传网站打不开被拦截怎么办
  • 现代企业网站建设特点企业网站建设
  • 高新企业建设网站公司祥云户网站
  • 做电影类网站wordpress国内主机
  • 南京企业网站设计公司500元海外 网站 推广
  • 网站制作千知寻数字广东网络有限公司
  • 做书照片网站泰安网站建设方案书
  • c#网站开发案例源码头像制作在线生成器
  • 天津网站建设制作软件做网络推广的团队
  • 音乐网站建设价格6林州风景网站建设的目的
  • 怎样建设自己的网站莱芜雪野湖地图
  • 德州市住房建设局网站开源网站模板cms
  • 建个网站的电话有哪些网站是cms
  • a站全称o2o网站设计
  • 济南网站优化推广腾讯企点网页版
  • 潍坊公司网站模板建站合肥建设银行网站首页
  • 能发朋友圈的网站建设广告语北京seo网络优化招聘网
  • 厦门中科做网站总打电话来wordpress 新闻列表
  • 网站哪家公司做得好建立网站信息发布登记制度
  • 做游戏的php网站有哪些传奇类游戏网站
  • 网站架构布局wordpress 做网课网站
  • 延吉网站建设多少钱wordpress 手机插件
  • 云主机 网站 多个二级域名 seo优化网站备案部门
  • 公司做网站买域名之后做什么网站建设客户调查需求表
  • 织梦网站文章相互调用网站开发 后端服务