06 2022 档案

摘要:一、简介 AtomicIntegerArray可以用原子方式操作其元素的int数组,是对Integer数组支持的原子性操作。原子数组类与对应的普通原子类相比,只是多了通过索引找到内存中元素地址的操作而已。 注意:原子数组并不是说可以让线程以原子方式一次性地操作数组中所有元素的数组,而是指对于数组中的 阅读全文
posted @ 2022-06-30 16:32 夏尔_717 阅读(240) 评论(0) 推荐(1) 编辑
摘要:一、简介 AtomicStampedReference可以给引用加上版本号,追踪引用的整个变化过程,如:A -> B -> C -> D - > A,通过AtomicStampedReference可以知道引用变量中途被更改了3次。但是有时候不需要关心引用变量更改了几次,只是单纯的关心是否更改过,所 阅读全文
posted @ 2022-06-29 16:19 夏尔_717 阅读(64) 评论(0) 推荐(0) 编辑
摘要:一、简介 AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用。也就是说它可以保证你在修改对象引用时的线程安全性。 AtomicReference是作用是对"对象"进行原子操作 阅读全文
posted @ 2022-06-28 16:53 夏尔_717 阅读(241) 评论(0) 推荐(0) 编辑
摘要:一、简介 AtomicStampedReference是java并发包下提供的一个原子类,它能解决其它原子类无法解决的ABA问题。 二、ABA 2.1 ABA问题 ABA问题发生在多线程环境中,当某线程连续读取同一块内存地址两次,两次得到的值一样,它简单地认为“此内存地址的值并没有被修改过”,然而, 阅读全文
posted @ 2022-06-27 11:32 夏尔_717 阅读(64) 评论(0) 推荐(0) 编辑
摘要:一、简介 在java.util.concurrent.atomic包中,由三个比较特殊的原子类:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater。 通过名称可以看到,这几类的功能大致相同,只是针对 阅读全文
posted @ 2022-06-26 16:53 夏尔_717 阅读(110) 评论(0) 推荐(0) 编辑
摘要:阿里《Java开发手册》最新嵩山版在20年8月3日发布,其中有一段内容如下: 【参考】volatile解决多线程内存不可见问题。对于一写多读,是可以解决变量同步问题,但是如果多写,同样无法解决线程安全问题。 说明:如果是count++操作,使用如下类实现: AtomicInteger count = 阅读全文
posted @ 2022-06-25 16:53 夏尔_717 阅读(81) 评论(0) 推荐(0) 编辑
摘要:一、简介 AtomicInteger应该是atomic框架中用得最多的原子类了。顾名思义,AtomicInteger是Integer类型的线程安全原子类,可以在应用程序中以原子的方式更新int值。 AtomicInteger的本质:自旋锁 + CAS原子操作。原子操作是多个线程同时执行,确保其是安全 阅读全文
posted @ 2022-06-24 16:51 夏尔_717 阅读(221) 评论(0) 推荐(0) 编辑
摘要:快速排序(Quicksort)是对冒泡排序的一种改进,由C.A.R.Hoare在1962年提出的一种划分交换排序,采用的是分治策略(一般与递归结合使用),以减少排序过程中的比较次数。 一、基本思想 快速排序的基本思想:挖坑填数 + 分治法。 首先选一个轴值(pivot,也有叫基准的),通过一趟排序将 阅读全文
posted @ 2022-06-24 11:55 夏尔_717 阅读(419) 评论(0) 推荐(0) 编辑
摘要:一、简介 Unsafe类在JDK源码中被广泛使用,在Spark使用off-heap memory时也会使用到,该类功能很强大,涉及到类加载机制(深入理解ClassLoader工作机制),其实例一般情况是获取不到的,源码中的设计是采用单例模式,不是系统加载初始化就会抛出SecurityExceptio 阅读全文
posted @ 2022-06-23 16:34 夏尔_717 阅读(346) 评论(0) 推荐(0) 编辑
摘要:一、概述 java的java.util.concurrent包除了提供底层锁、并发集合外,还提供了一组原子操作的封装类,它们位于java.util.concurrent.atomic包。 Atomic类是通过无锁(lock-free)的方式实现的线程安全(thread-safe)访问。 二、原子类底 阅读全文
posted @ 2022-06-20 22:55 夏尔_717 阅读(296) 评论(0) 推荐(0) 编辑
摘要:插入排序的设计初衷是往有序的数组中快速插入一个新的元素。它的算法思想是:把要排序的数组分为了两个部分,一部分是数组的全部元素(除去待插入的元素),另一部分是待插入的元素;先将第一部分排序完成,然后再插入这个元素。其中第一部分的排序也是通过再次拆分为两部分来进行的。 插入排序由于操作不尽相同,可分为直 阅读全文
posted @ 2022-06-20 18:58 夏尔_717 阅读(349) 评论(0) 推荐(0) 编辑
摘要:从算法逻辑上看,选择排序是一种简单直观的排序算法,在简单选择排序过程中,所需移动记录的次数比较少。 一、基本思想 选择排序的基本思想:比较 + 交换。 在未排序序列中找到最小(大)元素,存放到未排序序列的起始位置。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。 红色表示当前最 阅读全文
posted @ 2022-06-18 19:34 夏尔_717 阅读(146) 评论(0) 推荐(0) 编辑
摘要:前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做“树”是因为它看起来像一棵倒挂的树,包括二叉树、红黑树、2-3-4树、堆等各种不同的树,有对这几种树不了解的可以参考我前面几篇博客。而本篇博客我们将介绍另外一种数据结构——图,图也是计算机程 阅读全文
posted @ 2022-06-18 19:34 夏尔_717 阅读(133) 评论(0) 推荐(0) 编辑
摘要:在[队列]中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现,这种实现方式尽管删除最大数据项的时间复杂度为O(1),但是插入还是需要较长的时间O(N),因为每次插入平均需要移动一半的数据项 阅读全文
posted @ 2022-06-17 20:25 夏尔_717 阅读(138) 评论(0) 推荐(0) 编辑
摘要:Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key-value)而直接进行访问的数据结构。它基于数组,通过把关键字映射到数组的某个下标来加快查找速度,但是又和数组、链表、树等数据结构不同,在这些数据结构中查找某个关键字,通常要遍历整个数据结构,也就是O(N)的时间级,但是 阅读全文
posted @ 2022-06-16 21:48 夏尔_717 阅读(197) 评论(0) 推荐(0) 编辑
摘要:在二叉树中,每个节点只有一个数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树。2-3-4树,也是一种多叉树,它的每个节点最多有四个子节点和三个数据项。 一、介绍 2-3-4树每个节点最多有四个字节点和三个数据项,名字中2,3,4的数字含义是指一个节点可能含有的子 阅读全文
posted @ 2022-06-15 20:35 夏尔_717 阅读(93) 评论(0) 推荐(0) 编辑
摘要:二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构。那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部 阅读全文
posted @ 2022-06-15 20:34 夏尔_717 阅读(217) 评论(0) 推荐(0) 编辑
摘要:二叉搜索树对于某个节点而言,其左子树的节点关键值都小于该节点关键值,右子树的所有节点关键值都大于该节点关键值。二叉搜索树作为一种数据结构,其查找、插入和删除操作的时间复杂度都为O(logn),底数为2。但是我们说这个时间复杂度是在平衡的二叉搜索树上体现的,也就是如果插入的数据是随机的,则效率很高 阅读全文
posted @ 2022-06-15 20:34 夏尔_717 阅读(179) 评论(0) 推荐(0) 编辑
摘要:链表也是一种使用广泛的通用数据结构,它也可以用来作为实现栈、队列等数据结构的基础,基本上除非需要频繁的通过下标来随机访问各个数据,否则很多使用数组的地方都可以用链表来代替。 但是我们需要说明的是,链表是不能解决数据存储的所有问题的,它也有它的优点和缺点。常见的链表分别是单向链表、双端链表、有序链表、 阅读全文
posted @ 2022-06-13 22:46 夏尔_717 阅读(242) 评论(0) 推荐(0) 编辑
摘要:栈是后进先出,而队列刚好相反,是先进先出。 一、队列的基本概念 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有 阅读全文
posted @ 2022-06-13 16:17 夏尔_717 阅读(526) 评论(0) 推荐(0) 编辑
摘要:多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题——死锁。 一、什么是死锁 死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局(Deadly-Embrace),若无外力作用,这些进程(线程)都将无法向前推进。 下面我们通过一些实例来 阅读全文
posted @ 2022-06-12 21:31 夏尔_717 阅读(23) 评论(0) 推荐(0) 编辑
摘要:我想对于它每个学过C语言的都会了解,这可能是很多人接触的第一个排序算法。 一、基本思想 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 阅读全文
posted @ 2022-06-11 15:30 夏尔_717 阅读(407) 评论(0) 推荐(2) 编辑
摘要:一、基本概念 栈(stack)又称为堆栈或堆叠,栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要 阅读全文
posted @ 2022-06-11 14:05 夏尔_717 阅读(568) 评论(0) 推荐(0) 编辑
摘要:数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要的数据结构,当然每种语言对数组的实现和处理也不相同,但是本质是都是用来存放数据的的结构。 一、介绍 在Java中,数组是用来存放相同数据类型的对象集合,注意只能存放同一种数据类型(Object类型数组除外)。这些对象具有一定的 阅读全文
posted @ 2022-06-10 16:23 夏尔_717 阅读(341) 评论(0) 推荐(0) 编辑
摘要:一、锁的种类 在JUC中,大量使用到了锁,而Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录: 二、悲观锁与乐观锁 对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程 阅读全文
posted @ 2022-06-08 23:09 夏尔_717 阅读(49) 评论(0) 推荐(0) 编辑
摘要:一、概述 EnumMap是一个用于存储key为枚举类型的map,底层使用数组实现(K,V双数组)。下面是其继承结构: public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Ser 阅读全文
posted @ 2022-06-03 23:24 夏尔_717 阅读(52) 评论(0) 推荐(0) 编辑
摘要:一、简介 LinkedBlockingQueue是java并发包下一个以单链表实现的阻塞队列,它是线程安全的,至于它是不是有界的,请看下面的分析。 二、源码分析 2.1 属性 // 容量 private final int capacity; // 元素数量 private final Atomic 阅读全文
posted @ 2022-06-03 23:24 夏尔_717 阅读(40) 评论(0) 推荐(0) 编辑
摘要:一、简介 SynchronousQueue是java并发包下无缓冲阻塞队列,它用来在两个线程之间移交元素,但是它有个很大的问题,你知道是什么吗?请看下面的分析。 二、源码分析 2.1 属性 // CPU的数量 static final int NCPUS = Runtime.getRuntime() 阅读全文
posted @ 2022-06-03 23:24 夏尔_717 阅读(70) 评论(0) 推荐(0) 编辑
摘要:一、概述 EnumSet是一个抽象类,不能直接使用,该类有两个子类,RegularEnumSet和JumboEnumSet。即枚举值的个数小于等于64时使用RegularEnumSet,大于64时使用JumboEnumSet。 这两个子类都是非public的,只能包内访问。 当EnumSet需要进行 阅读全文
posted @ 2022-06-03 23:23 夏尔_717 阅读(69) 评论(0) 推荐(0) 编辑
摘要:一、概述 RegularEnumSet适用于枚举值个数小于等于64的EnumSet,RegularEnumSet定义了一个私有的long类型变量elements,long类型一共64位,如果某一位为1则表示该位对应的值对应的枚举值已经添加到RegularEnumSet中了,具体细节参考下面的源码分析 阅读全文
posted @ 2022-06-02 22:37 夏尔_717 阅读(84) 评论(0) 推荐(0) 编辑
摘要:一、概述 StringJoiner是java.util包下的一个工具类,是JDK 1.8引入的字符串拼接器。 作用是在构造字符串时,可以自动添加前缀、后缀及分隔符,而不需要自己去实现这些添加字符的逻辑。 虽然这也可以在StringBuilder类的帮助下在每个字符串之后附加分隔符,但StringJo 阅读全文
posted @ 2022-06-02 22:37 夏尔_717 阅读(160) 评论(0) 推荐(0) 编辑
摘要:一、概述 JumboEnumSet适用于枚举值个数大于64个的枚举类,其底层实现跟RegularEnumSet一样都是根据位是否为1来判断该枚举值是否添加到了Set中,不过因为枚举值个数大于64个,无法用64位的long类型来记录所有的枚举值,所以将RegularEnumSet中long类型的ele 阅读全文
posted @ 2022-06-02 22:37 夏尔_717 阅读(116) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示