摘要:
一、简介 AtomicIntegerArray可以用原子方式操作其元素的int数组,是对Integer数组支持的原子性操作。原子数组类与对应的普通原子类相比,只是多了通过索引找到内存中元素地址的操作而已。 注意:原子数组并不是说可以让线程以原子方式一次性地操作数组中所有元素的数组,而是指对于数组中的 阅读全文
摘要:
一、简介 AtomicStampedReference可以给引用加上版本号,追踪引用的整个变化过程,如:A -> B -> C -> D - > A,通过AtomicStampedReference可以知道引用变量中途被更改了3次。但是有时候不需要关心引用变量更改了几次,只是单纯的关心是否更改过,所 阅读全文
摘要:
一、简介 AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用。也就是说它可以保证你在修改对象引用时的线程安全性。 AtomicReference是作用是对"对象"进行原子操作 阅读全文
摘要:
一、简介 AtomicStampedReference是java并发包下提供的一个原子类,它能解决其它原子类无法解决的ABA问题。 二、ABA 2.1 ABA问题 ABA问题发生在多线程环境中,当某线程连续读取同一块内存地址两次,两次得到的值一样,它简单地认为“此内存地址的值并没有被修改过”,然而, 阅读全文
摘要:
一、简介 在java.util.concurrent.atomic包中,由三个比较特殊的原子类:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater。 通过名称可以看到,这几类的功能大致相同,只是针对 阅读全文
摘要:
阿里《Java开发手册》最新嵩山版在20年8月3日发布,其中有一段内容如下: 【参考】volatile解决多线程内存不可见问题。对于一写多读,是可以解决变量同步问题,但是如果多写,同样无法解决线程安全问题。 说明:如果是count++操作,使用如下类实现: AtomicInteger count = 阅读全文
摘要:
一、简介 AtomicInteger应该是atomic框架中用得最多的原子类了。顾名思义,AtomicInteger是Integer类型的线程安全原子类,可以在应用程序中以原子的方式更新int值。 AtomicInteger的本质:自旋锁 + CAS原子操作。原子操作是多个线程同时执行,确保其是安全 阅读全文
摘要:
快速排序(Quicksort)是对冒泡排序的一种改进,由C.A.R.Hoare在1962年提出的一种划分交换排序,采用的是分治策略(一般与递归结合使用),以减少排序过程中的比较次数。 一、基本思想 快速排序的基本思想:挖坑填数 + 分治法。 首先选一个轴值(pivot,也有叫基准的),通过一趟排序将 阅读全文
摘要:
一、简介 Unsafe类在JDK源码中被广泛使用,在Spark使用off-heap memory时也会使用到,该类功能很强大,涉及到类加载机制(深入理解ClassLoader工作机制),其实例一般情况是获取不到的,源码中的设计是采用单例模式,不是系统加载初始化就会抛出SecurityExceptio 阅读全文
摘要:
一、概述 java的java.util.concurrent包除了提供底层锁、并发集合外,还提供了一组原子操作的封装类,它们位于java.util.concurrent.atomic包。 Atomic类是通过无锁(lock-free)的方式实现的线程安全(thread-safe)访问。 二、原子类底 阅读全文
摘要:
插入排序的设计初衷是往有序的数组中快速插入一个新的元素。它的算法思想是:把要排序的数组分为了两个部分,一部分是数组的全部元素(除去待插入的元素),另一部分是待插入的元素;先将第一部分排序完成,然后再插入这个元素。其中第一部分的排序也是通过再次拆分为两部分来进行的。 插入排序由于操作不尽相同,可分为直 阅读全文
摘要:
从算法逻辑上看,选择排序是一种简单直观的排序算法,在简单选择排序过程中,所需移动记录的次数比较少。 一、基本思想 选择排序的基本思想:比较 + 交换。 在未排序序列中找到最小(大)元素,存放到未排序序列的起始位置。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。 红色表示当前最 阅读全文
摘要:
前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做“树”是因为它看起来像一棵倒挂的树,包括二叉树、红黑树、2-3-4树、堆等各种不同的树,有对这几种树不了解的可以参考我前面几篇博客。而本篇博客我们将介绍另外一种数据结构——图,图也是计算机程 阅读全文
摘要:
在[队列]中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现,这种实现方式尽管删除最大数据项的时间复杂度为O(1),但是插入还是需要较长的时间O(N),因为每次插入平均需要移动一半的数据项 阅读全文
摘要:
Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key-value)而直接进行访问的数据结构。它基于数组,通过把关键字映射到数组的某个下标来加快查找速度,但是又和数组、链表、树等数据结构不同,在这些数据结构中查找某个关键字,通常要遍历整个数据结构,也就是O(N)的时间级,但是 阅读全文
摘要:
在二叉树中,每个节点只有一个数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树。2-3-4树,也是一种多叉树,它的每个节点最多有四个子节点和三个数据项。 一、介绍 2-3-4树每个节点最多有四个字节点和三个数据项,名字中2,3,4的数字含义是指一个节点可能含有的子 阅读全文
摘要:
二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构。那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部 阅读全文
摘要:
二叉搜索树对于某个节点而言,其左子树的节点关键值都小于该节点关键值,右子树的所有节点关键值都大于该节点关键值。二叉搜索树作为一种数据结构,其查找、插入和删除操作的时间复杂度都为$O(logn)$,底数为2。但是我们说这个时间复杂度是在平衡的二叉搜索树上体现的,也就是如果插入的数据是随机的,则效率很高 阅读全文
摘要:
链表也是一种使用广泛的通用数据结构,它也可以用来作为实现栈、队列等数据结构的基础,基本上除非需要频繁的通过下标来随机访问各个数据,否则很多使用数组的地方都可以用链表来代替。 但是我们需要说明的是,链表是不能解决数据存储的所有问题的,它也有它的优点和缺点。常见的链表分别是单向链表、双端链表、有序链表、 阅读全文
摘要:
栈是后进先出,而队列刚好相反,是先进先出。 一、队列的基本概念 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有 阅读全文