[学习笔记-Java并发源码-2] volatile的实现原理

2019-09-02
阅读 12 分钟
2k
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。

[学习笔记-Java并发源码-1] synchronized的实现原理

2019-08-31
阅读 6 分钟
2k
在Java中,如果一遇到多线程情况需要解决,我们想到最多的可能就是synchronized。或者叫它“同步”,很早以前或许synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们慢慢摒弃它。

[学习笔记-Java并发源码] 目录

2019-08-31
阅读 1 分钟
1.5k
本系列开始记录针对java并发体系的相关源码学习。大部分来之网络内容,只是自己整理与总结之用。 synchronized synchronized的实现原理 volatile的实现原理 AQS

[学习笔记-Java集合-17] Queue - DelayQueue源码分析

2019-08-24
阅读 5 分钟
1.7k
介绍 DelayQueue是java并发包下的延时阻塞队列,常用于实现定时任务。 继承体系 从继承体系可以看到,DelayQueue实现了BlockingQueue,所以它是一个阻塞队列。 另外,DelayQueue还组合了一个叫做Delayed的接口,DelayQueue中存储的所有元素必须实现Delayed接口。 那么,Delayed是什么呢? {代码...} Delayed是一个继承自...

[学习笔记-Java集合-16] Queue - LinkedBlockingQueue源码分析

2019-08-22
阅读 4 分钟
1.3k
介绍 LinkedBlockingQueue是java并发包下一个以单链表实现的阻塞队列,它是线程安全的,至于它是不是有界的,请看下面的分析。 源码分析 主要属性 {代码...} capacity,有容量,可以理解为LinkedBlockingQueue是有界队列 head, last,链表头、链表尾指针 takeLock,notEmpty,take锁及其对应的条件 putLock, notFull,pu...

[学习笔记-Java集合-15] Queue - ArrayBlockingQueue源码分析

2019-08-21
阅读 5 分钟
1.2k
介绍 ArrayBlockingQueue是java并发包下一个以数组实现的阻塞队列,它是线程安全的,至于是否需要扩容,请看下面的分析。 队列 队列,是一种线性表,它的特点是先进先出,又叫FIFO,就像我们平常排队一样,先到先得,即先进入队列的人先出队。 源码分析 主要属性 {代码...} 通过属性我们可以得出以下几个重要信息: 利用...

[学习笔记-Java集合-14] Queue - PriorityQueue源码分析

2019-08-20
阅读 5 分钟
1.7k
介绍 优先级队列,是0个或多个元素的集合,集合中的每个元素都有一个权重值,每次出队都弹出优先级最大或最小的元素。 一般来说,优先级队列使用堆来实现。 源码分析 主要属性 {代码...} 默认容量是11; queue,元素存储在数组中,这跟我们之前说的堆一般使用数组来存储是一致的; comparator,比较器,在优先级队列中,...

[学习笔记-Java集合-13] Set - ConcurrentSkipListSet源码分析

2019-08-18
阅读 7 分钟
1.8k
可以看到,ConcurrentSkipListSet基本上都是使用ConcurrentSkipListMap实现的,虽然取子set部分是使用ConcurrentSkipListMap中的内部类,但是这些内部类其实也是和ConcurrentSkipListMap相关的,它们返回ConcurrentSkipListMap的一部分数据。

[学习笔记-Java集合-12] Set - CopyOnWriteArraySet源码分析

2019-08-18
阅读 6 分钟
2.4k
但是,我们知道CopyOnWriteArrayList底层其实是一个数组,它是允许元素重复的,那么用它来实现CopyOnWriteArraySet怎么保证元素不重复呢?

[学习笔记-Java集合-11] Map - ConcurrentSkipListMap源码分析

2019-08-18
阅读 19 分钟
1.8k
介绍 跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。 跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。 跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。 存储结构 跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。 源码分析 主要内部类 内...

[学习笔记-Java集合-10] Set - LinkedHashSet源码分析

2019-08-17
阅读 2 分钟
1.5k
介绍 上一节我们说HashSet中的元素是无序的,那么有没有什么办法保证Set中的元素是有序的呢? 答案是当然可以。 LinkedHashSet就有这个功能,它是怎么实现有序的呢? 源码分析 LinkedHashSet继承自HashSet,让我们直接上源码来看看它们有什么不同。 {代码...} 完了,这是全部源码了。 可以看到,LinkedHashSet中一共提供...

[学习笔记-Java集合-9] Set - HashSet源码分析

2019-08-17
阅读 7 分钟
1.7k
简介 集合,这个概念有点模糊。 广义上来讲,java中的集合是指java.util包下面的容器类,包括和Collection及Map相关的所有类。 中义上来讲,我们一般说集合特指java集合中的Collection相关的类,不包含Map相关的类。 狭义上来讲,数学上的集合是指不包含重复元素的容器,即集合中不存在两个相同的元素,在java里面对应Se...

[学习笔记-Java集合-8] Map - ConcurrentHashMap 源码分析(二)

2019-08-17
阅读 8 分钟
1.4k
删除元素 删除元素跟添加元素一样,都是先找到元素所在的桶,然后采用分段锁的思想锁住整个桶,再进行操作。 {代码...} 计算hash; 如果所在的桶不存在,表示没有找到目标元素,返回; 如果正在扩容,则协助扩容完成后再进行删除操作; 如果是以链表形式存储的,则遍历整个链表查找元素,找到之后再删除; 如果是以树形...

[学习笔记-Java集合-7] Map - ConcurrentHashMap 源码分析(一)

2019-08-17
阅读 18 分钟
1.4k
synchronized java中的关键字,内部实现为监视器锁,主要是通过对象监视器在对象头中的字段来表明的。 synchronized从旧版本到现在已经做了很多优化了,在运行时会有三种存在方式:偏向锁,轻量级锁,重量级锁。 偏向锁,是指一段同步代码一直被一个线程访问,那么这个线程会自动获取锁,降低获取锁的代价。 轻量级锁,...

[学习笔记-Java集合-6] Map - WeakHashMap源码分析

2019-08-14
阅读 9 分钟
1.5k
WeakHashMap是一种弱引用map,内部的key会存储为弱引用,当jvm gc的时候,如果这些key没有强引用存在的话,会被gc回收掉,下一次当我们操作map的时候会把对应的Entry整个删除掉,基于这种特性,WeakHashMap特别适用于缓存处理。

[学习笔记-Java集合-5]Map - LinkedHashMap源码分析

2019-08-12
阅读 6 分钟
1.4k
简介 LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现LRU缓存策略。 LinkedHashMap可以看成是 LinkedList + HashMap。 继承体系 LinkedHashMap继承HashMap,拥有HashMap的所有特性,并且额外增加的按一定顺序访问的特性 存储结构 我们知道HashMap使用(数组 + 单链...

[学习笔记-Java集合-4] Map - HashMap源码分析

2019-08-12
阅读 20 分钟
1.8k
HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序;

[学习笔记-Java集合-3] List - CopyOnWriteArrayList源码分析

2019-08-10
阅读 7 分钟
2.1k
CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离。

[学习笔记-Java集合-2] List - LinkedList源码分析

2019-08-10
阅读 6 分钟
1.4k
LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧。

[学习笔记-Java集合-1] List - ArrayList源码分析

2019-08-08
阅读 8 分钟
1.9k
简介 ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。 继承体系 ArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口。 ArrayList实现了List,提供了基础的添加、删除、遍历等操作。 ArrayList实现了RandomAccess,提供了随机访问的能力。 ArrayL...

[学习笔记-Java集合] 目录

2019-08-08
阅读 1 分钟
2.5k
本系列开始记录针对java集合体系的相关源码学习。大部分来之网络内容,只是自己整理与总结之用。 分为5大块 List List中的元素是有序的、可重复的,主要实现方式有动态数组和链表。 ArrayList LinkedList CopyOnWriteArrayList Map HashMap LinkedHashMap WeakHashMap ConcurrentHashMap 源码分析(一) ConcurrentHashM...

[Java并发-12] 原子类:无锁工具类的典范

2019-06-16
阅读 6 分钟
1.9k
前面我们多次提到一个累加器的例子,示例代码如下。在这个例子中,add10K() 这个方法不是线程安全的,问题就出在变量 count 的可见性和 count+=1 的原子性上。可见性问题可以用 volatile 来解决,而原子性问题我们前面一直都是采用的互斥锁方案。

[Java并发-11] 并发容器的使用

2019-05-26
阅读 4 分钟
1.8k
Java 1.5 之前提供的同步容器虽然也能保证线程安全,但是性能很差,而 Java 1.5 版本之后提供的并发容器在性能方面则做了很多优化,并且容器的类型也更加丰富了。下面我们就对比二者来学习这部分的内容。

[Java并发-10] ReadWriteLock:快速实现一个完备的缓存

2019-05-13
阅读 3 分钟
2.4k
大家知道了Java中使用管程同步原语,理论上可以解决所有的并发问题。那 Java SDK 并发包里为什么还有很多其他的工具类呢?原因很简单:分场景优化性能,提升易用性

[Java并发-7]java的线程小节

2019-05-11
阅读 7 分钟
1.5k
在 Java 领域,实现并发程序的主要手段就是多线程。线程是操作系统里的一个概念,虽然各种不同的开发语言如 Java、C# 等都对其进行了封装,但原理和思路都是相同都。Java 语言里的线程本质上就是操作系统的线程,它们是一一对应的。

[Java并发-6]“管程”-java管程初探

2019-04-27
阅读 5 分钟
5.2k
并发编程这个技术领域已经发展了半个世纪了。有没有一种核心技术可以很方便地解决我们的并发问题呢?这个问题, 我会选择 Monitor(管程)技术。Java 语言在 1.5 之前,提供的唯一的并发原语就是管程,而且 1.5 之后提供的 SDK 并发包,也是以管程技术为基础的。除此之外,C/C++、C# 等高级语言也都支持管程。

[Java并发-5]用“等待-通知”机制优化循环等待

2019-04-19
阅读 3 分钟
2.9k
由上一篇文章你应该已经知道,在 破坏占用且等待条件 的时候,如果转出账本和转入账本不满足同时在文件架上这个条件,就用死循环的方式来循环等待,核心代码如下:

[Java并发-4]解决Java死锁的问题

2019-04-18
阅读 5 分钟
2.4k
在上一篇中,我们尝试使用了 Account.class作为互斥锁,来解决转账问题。但是很容易发现这样,所有的转账操作都是串行的,性能太差了。

java单例模式几种实现方式分析

2019-04-10
阅读 2 分钟
1.2k
这种方法可以实现延时加载,但是有一个致命弱点:线程不安全(可见性,有序性)。如果有两条线程同时调用getSingleton()方法,就有很大可能导致重复创建对象。

[Java并发-3]Java互斥锁,解决原子性问题

2019-04-10
阅读 7 分钟
2.8k
在前面的分享中我们提到。 一个或者多个操作在 CPU 执行的过程中不被中断的特性,称为“原子性” 思考:在32位的机器上对long型变量进行加减操作存在并发问题,什么原因!? 原子性问题如何解决 我们已经知道原子性问题是线程切换,而操作系统做线程切换是依赖 CPU 中断的,所以禁止 CPU 发生中断就能够禁止线程切换。 在...