![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 83
针对并发编程相关知识进行分析
有温度的代码
我本微末凡尘,却也心向天空
展开
-
TreeSet源码分析
TreeSet 是基于 TreeMap 的 Set 实现类。原创 2023-05-18 08:06:59 · 380 阅读 · 0 评论 -
HashSet源码解析
HashSet 是基于 HashMap 的 Set 实现类。原创 2023-05-12 14:12:21 · 1557 阅读 · 0 评论 -
LinkedHashMap源码解析
LinkedHashMap 是 HashMap 的子类,增加了顺序访问的特性。【默认】当 accessOrder = false 时,按照 key-value 的插入顺序进行访问。当 accessOrder = true 时,按照 key-value 的读取顺序进行访问。LinkedHashMap 的顺序特性,通过内部的双向链表实现,所以我们把它看成是 LinkedList + LinkedHashMap 的组合。原创 2023-05-10 09:27:59 · 2354 阅读 · 0 评论 -
linkindList源码分析
LinkedList 基于节点实现的双向链表的 List ,每个节点都指向前一个和后一个节点从而形成链表。LinkedList 提供队列、双端队列、栈的功能。因为 first 节点,所以提供了队列的功能的实现的功能。因为 last 节点,所以提供了栈的功能的实现的功能。因为同时具有 first + last 节点,所以提供了双端队列的功能。LinkedList 随机访问平均时间复杂度是 O(n) ,查找指定元素的平均时间复杂度是 O(n)。原创 2023-05-09 23:30:00 · 2144 阅读 · 0 评论 -
深入HashMap源码
在初次看到 HashMap 时,都惊奇于其 O(1) 的 get 操作的时间复杂度。当时在我们已知的数据结构中,只有基于下标访问数组时,才能提供 O(1) get 操作的时间复杂度。实际上,HashMap 所提供的 O(1) 是平均时间复杂度,大多数情况下保证 O(1)。其实极端情况下,有可能退化为 O(N) 的时间复杂度噢,这又是为什么呢?原创 2023-05-08 16:32:59 · 1997 阅读 · 0 评论 -
为什么使用ConcurrentHashMap
JDK1.7是在调用size()方法才去计算,其实在并发集合中去计算size是没有多大的意义的,因为size是实时在变的,只能计算某一刻的大小,但是某一刻太快了,人的感知是一个时间段,所以并不是很精确。计算ConcurrentHashMap的元素大小是一个有趣的问题,因为他是并发操作的,就是在你计算size的时候,他还在并发的插入数据,可能会导致你计算出来的size和你实际的size有相差(在你return size的时候,插入了多个数据),要解决这个问题,JDK1.7版本用两种方案。原创 2023-05-08 13:02:10 · 2585 阅读 · 0 评论 -
cas底层实现
CAS大家都知道,这是一项乐观锁技术,是Compare And Swap的简称,顾名思义就是先比较再替换。虽然他叫乐观锁,但是我们都知道它是不需要加锁的,在JDK1.5 中的JUC就是建立在CAS之上的。相对于synchronized这种阻塞算法,CAS是非阻塞算法的一种常见实现。所以J.U.C在性能上有了很大的提升。我们以java.util.concurrent中的AtomicInteger为例,看一下在不使用锁的情况下是如何保证线程安全的。原创 2023-04-29 00:30:00 · 1732 阅读 · 0 评论 -
死锁、活锁
死锁,是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。活锁,任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。悲观锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。原创 2023-04-25 16:51:47 · 1308 阅读 · 0 评论 -
volatile 实现原理
Java 语言规范第三版中对 volatile 的定义如下: java 编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java 语言提供了 volatile,在某些情况下比锁更加方便。如果一个字段被声明成 volatile,java 线程内存模型确保所有线程看到这个变量的值是一致的。原创 2023-04-25 14:48:47 · 2000 阅读 · 1 评论 -
并发编程的可见性、原子性、有序性
原子性指的是一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不 会被其他线程影响。在java中,对基本数据类型的变量的读取和赋值操作是原子性操作有点要注意的是,对 于32位系统的来说,long类型数据和double类型数据(对于基本数据类型,原创 2023-04-19 08:56:55 · 1700 阅读 · 0 评论 -
synchronized 的原理
这是基于在大多数情 况下,线程持有锁的时间都不会太长,如果直接挂起操作系统层面的线程可能会得不偿失,毕竟操作系统实现线程之间的切换时需要 从用户态转换到核心态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,因此自旋锁会假设在不久将来,当前的线 程可以获得锁,因此虚拟机会让当前想要获取锁的线程做几个空循环(这也是称为自旋的原因),一般不会太久,可能是50个循环或 100循环,在经过若干次循环后,如果得到锁,就顺利进入临界区。级锁,但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级。原创 2023-04-18 13:27:07 · 1136 阅读 · 0 评论