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

邢台网站推广多少钱百度站长之家工具

邢台网站推广多少钱,百度站长之家工具,网站排名优化推广,网站程序方面ConcurrentLinkedQueue的源码解析(基于JDK1.8) ConcurrentLinkedQueue是Java集合框架中的一种线程安全的队列,它是通过CAS(Compare and Swap)算法实现的并发队列。在并发场景下,ConcurrentLinkedQueue能够…

ConcurrentLinkedQueue的源码解析(基于JDK1.8)

ConcurrentLinkedQueue是Java集合框架中的一种线程安全的队列,它是通过CAS(Compare and Swap)算法实现的并发队列。在并发场景下,ConcurrentLinkedQueue能够保证队列的线程安全性,同时性能也很不错。

数据结构

ConcurrentLinkedQueue是基于链表实现的队列,内部维护一个head节点和tail节点,head和tail都是指向链表中的节点。

入队操作

ConcurrentLinkedQueue的入队操作通过CAS算法实现,它的核心代码如下:

public boolean offer(E e) {checkNotNull(e);final Node<E> newNode = new Node<E>(e);for (Node<E> t = tail, p = t;;) {Node<E> q = p.next;if (q == null) {// p is last nodeif (p.casNext(null, newNode)) {// Successful CAS is the linearization point// for e to become an element of this queue,// and for newNode to become "live".if (p != t) // hop two nodes at a timecasTail(t, newNode);  // Failure is OK.return true;}// Lost CAS race to another thread; re-read next}else if (p == q)// We have fallen off list.  If tail is unchanged, it// will also be off-list, in which case we need to// jump to head, from which all live nodes are always// reachable.  Else the new tail is a better bet.p = (t != (t = tail)) ? t : head;else// Check for tail updates after two hops.p = (p != t && t != (t = tail)) ? t : q;}
}

它的流程如下:

  1. 首先,创建一个新节点newNode。
  2. 获取tail节点和tail节点的下一个节点p。
  3. 如果p为空,则说明当前节点p是队列中的最后一个节点,这时候尝试通过CAS将新节点newNode插入到链表中。
  4. 如果CAS操作成功,则表示插入成功,并且将tail指针指向新的节点newNode。
  5. 如果CAS操作失败,则说明有其他线程已经修改了tail指针,需要重新获取tail指针。
  6. 如果p不为空,则需要判断p和tail是否指向同一个节点,如果是,则说明tail指针已经落后了,需要重新获取tail指针。
  7. 如果p和tail不是同一个节点,则需要将p指向p的下一个节点。
  8. 重复上述过程,直到插入成功为止。

出队操作

ConcurrentLinkedQueue的出队操作也是通过CAS算法实现,它的核心代码如下:

public E poll() {restartFromHead:for (;;) {for (Node<E> h = head, p = h, q;;) {E item = p.item;if (item != null && p.casItem(item, null)) {// Successful CAS is the linearization point// for item to be removed from this queue.if (p != h) // hop two nodes at a timeupdateHead(h, ((q = p.next) != null) ? q : p);return item;}else if ((q = p.next) == null) {updateHead(h, p);return null;}else if (p == q)continue restartFromHead;elsep = q;}}
}

它的流程如下:

  1. 首先,获取head节点和head节点的下一个节点p。
  2. 如果p为空,则说明队列为空,直接返回null。
  3. 如果p不为空,则尝试通过CAS将p节点的元素item设置为null。
  4. 如果CAS操作成功,则表示当前节点p被成功出队,并且返回出队的元素item。
  5. 如果CAS操作失败,则说明有其他线程已经修改了当前节点p的元素item,需要重新获取head节点。
  6. 如果p的下一个节点q为空,则需要更新head节点为p,并返回null。
  7. 如果p和p的下一个节点q是同一个节点,则说明head节点已经落后了,需要重新获取head节点。
  8. 如果p和p的下一个节点q不是同一个节点,则将p指向q。
  9. 重复上述过程,直到出队成功为止。

总结

ConcurrentLinkedQueue是一种高效的并发队列,它通过CAS算法实现了线程安全的入队和出队操作。在并发场景下,ConcurrentLinkedQueue能够保证队列的线程安全性,同时性能也很不错。因此,在Java并发编程中,ConcurrentLinkedQueue是一种常用的数据结构。

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

相关文章:

  • 徐州市城乡建设局网站首页怎么做网页挣钱
  • 网站建设用什么程序语言网页设计模板素材旅游
  • 青岛网站建设设计wordpress做的企业官网
  • wap网站是什么硅胶模具技术支持东莞网站建设
  • 达州网站建设qinsanw河北省建设厅报名网站
  • 中国建设银行员工学习网站网络销售网站有哪些
  • 做医学网站青岛缤纷网络科技有限公司
  • 搜维斯网站建设网站设计制作怎样可以快速
  • 牛博网站建设装修网站设计平台
  • html登录页面代码中小型企业网站优化推广
  • 怎么建自己的手机网站淘宝网页版登录入口电脑版
  • 邯郸手机网站建设微商城怎么做
  • 餐厅网站建设什么科目施工企业绩效考核管理办法
  • 购物网站建设目标客户分析论文怎样设网站
  • 济南网站开发企业富利建设集团有限公司网站
  • 创建一个网站主页邯郸网站设计培训
  • 江苏荣邦建设有限公司网站北京网站推广排名公司
  • 常德农科院网站wordpress3.8.3
  • wordpress图书seo网站查询工具
  • 做网站有弹窗叫什么263企业邮箱怎么注册
  • wordpress站点统计做区块链的网站
  • 怎么用自己电脑做网站免费图片在线制作
  • 网络信息安全网站开发教程柳江企业网站建设价格
  • 计算机基础网站建设和网络安全wordpress主题首页主体
  • 上海做网站品牌搜索引擎优化是什么
  • 网站首页一般做多大尺寸微信公众号同步wordpress
  • 网站分类目录查询做响应式网站费用
  • 礼服外贸网站南京百度推广网站
  • 网站建设费能算作广告费用吗自适应网站内容做多大尺寸
  • 聊城网站推广wordpress弹窗视频