热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从零单排JavaConcurrency,SkipList&ConcurrnetSkipListMap

感概好久没有写博客,自从上次已经有7,8个月了吧,在7,8个月里面接触的东西,学习到的东西也挺多的,由于没有写博客,或者是缺少总结的原因,很多东西都慢慢地遗忘了。还有就是时间确实不


感概


好久没有写博客,自从上次已经有7,8个月了吧,在7,8个月里面接触的东西,学习到的东西也挺多的,由于没有写博客,或者是缺少总结的原因,很多东西都慢慢地遗忘了。还有就是时间确实不够,时间从来就没有够过。不管了,从这次开始要慢慢地拾起这些东西,慢慢地做出些改变。


概述


这次给大家带来的 ConcurrentSkipListMap, 首先它是一个线程安全的Map, 这个就类似于ConcurrentHashMap, 可以用于并发的场景,其次它保证了绝大多数操作都在O(log(n))之类完成,并且它还保证 存储的顺序,可以设置Comparator来做Key的排序,这些好处都来源于 Skip List, 俗称跳表。


跳表介绍


Skip List是 William Pugh 在1989年创建出来的(又见一个位神牛), 主要的目的就像他描述的那样,是用来替代平衡树的。跳表是一种随机性的数据结构,相对于平衡树来说,跳表更加的简单,能一口气实现红黑树,AVL这样的平衡树的人,还是太少了,而且内部确实复杂,调试, 用起来太麻烦。 同样跳表还可以做到平衡树那样的查找时间,特别是在并发的场景下面,由于红黑树的插入或者删除会做rebalance这样操作,那么影响的数据就会变多,锁的粒度就变大。但是跳表的插入或者删除操作影响的数据会很小,锁的粒度就会小,这样在大数据量的情况下,跳表的性能自然就会比红黑树要好。


跳表细节


先看下面这张图:



这就是一个跳表,看图说话可以得到的是底部是含有所有元素的链表,并且是有序的。 设想我们如果需要在一个有序的链表上查找一个数,一般的做法就是顺序遍历一下列表,然后拿查找的元素来比较各个存在元素,时间复杂度为O(n)


后来二分查找出现了,先选取中间的元素来判断,如果大于就抛弃左边的,直接进入右边进行比较,时间复杂度为O(logn). 其实跳表也是利用了这样的特性(找出一个合适的值来跟当前值进行比较,不一定就是中间值),概率性抽取一部分数字提取出来,优先做比较,假设这个概率为p, 抽取一层过后,又抽取一层,直到最后只剩首元素和最后的NIL. 就像上图一样: a. 我们有 20, 30, 40, 50, 70, 90 这样的数组 b. 假设P等于1/2概率, 就只有40, 70, 90中奖了,有幸升级了 c. 又来一次1/2概率, 就只有40中奖,有幸升级 d. 再来一次1/2概率, 40不幸没有升上去,这时候就到顶了。


那么来看下查找的过程是怎么样的 假设我们需要查找70,步骤如下:



  • 首先从Top层出发,70 > 20, 并且 70 != NIL, 继续往下查找

  • 到了第2层的20,然后发现 70 > 20, 这时候往右走,来到40的节点, 70 > 40, 但是70 != NIL,继续往下查找

  • 到了第3层的40,然后发现70 > 40, 继续往右边走,这时候来到 70,发现 70 = 70,查找结束。



经过一堆长串公式得到,跳表的查找时间复杂度为 O(log(n)).


跳表的插入,其实整个插入的过程跟查找的过程类似,不一样的是,插入的元素肯定会出现在底部的链表中,所以当确定了插入的位置后,这时候会有个叫做“Coin Flip”的过程,丢硬币,就是根据概率公式(求出P那个),那计算下这时候这个新的节点需不需要往上”升级”, 如果需要就往上升,不需要就算了。重复这个”Coin Flip”的操作,直到不”升级”,当然升级上去之后,也需要和当前这一层的元素前后连接起来。


删除操作,类似先找到该元素,然后把它和它上层的元素都进行删除。 不像平衡树一样,跳表并不能保证查找的最坏情况,而平衡树却保证最坏也是O(logn), 确实有可能性,coin-flips的过程会让跳表产生不平衡的结构,但是这种情况只有要” 被到家”才发生,并且在实际情况下,大家都会选择如此简单的跳表而不是平衡树。


跳表也有一些O(n)的操作,强制我们去遍历一次整个表,例如打印所有元素呀,算下size()之类的。


ConcurrnetSkipListMap的实现


其实ConcurrentSkipListMap的实现就是实现了一个无锁版的跳表,主要是利用无锁的链表的实现来管理跳表底层,同样利用CAS来完成替换。以后会带来无锁的设计实现。


Summary


简单介绍了跳表设计思想和应用,以及在高并发的情况下,优于平衡树的原因,所以跳表在并发计算领域出现了,redis, leveldb都用应用,并且在分布式里面可以利用跳表的无锁特性来实现优先级队列。跳表其实也是一种利用空间换取时间的方法,所以这里P 概率的选择,至关重要。




推荐阅读
  • 探讨Redis的最佳应用场景
    本文将深入探讨Redis在不同场景下的最佳应用,包括其优势和适用范围。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • Java并发机制详解及其在数据安全性保障中的应用方案 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在当今的软件开发领域,分布式技术已成为程序员不可或缺的核心技能之一,尤其在面试中更是考察的重点。无论是小微企业还是大型企业,掌握分布式技术对于提升工作效率和解决实际问题都至关重要。本周的Java架构师实战训练营中,我们深入探讨了Kafka这一高效的分布式消息系统,它不仅支持发布订阅模式,还能在高并发场景下保持高性能和高可靠性。通过实际案例和代码演练,学员们对Kafka的应用有了更加深刻的理解。 ... [详细]
author-avatar
简瞳之殇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有