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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[Java并发-26] 软件事务内存:借鉴数据库的并发经验

2019-07-19
阅读 5 分钟
3.1k
实际上我们天天都在写并发程序,只不过并发相关的问题都被类似 Tomcat 这样的 Web 服务器以及 MySQL 这样的数据库解决了。尤其是数据库,在解决并发问题方面,可谓博大精深,它的事务机制非常简单易用,能甩 Java 里面的锁、原子类十条街。很显然对于我们要借鉴一下。

[Java并发-25] 高性能数据库连接池 HiKariCP 分析

2019-07-16
阅读 6 分钟
6.8k
实际工作中,我们总会难免和数据库打交道;只要和数据库打交道,就免不了使用数据库连接池。业界知名的数据库连接池有不少,例如 DBCP、Tomcat JDBC Connection Pool、Druid 等,不过最近最火的是 HiKariCP。

[Java并发-24-并发设计模式] 生产者-消费者模式,并发提高效率

2019-07-15
阅读 4 分钟
5k
生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式。

[Java并发-23-并发设计模式] 两阶段终止模式:优雅地终止线程

2019-07-15
阅读 4 分钟
4.7k
java的线程小节中,我曾讲过:线程执行完或者出现异常就会进入终止状态。这样看,终止一个线程看上去很简单啊!一个线程执行完自己的任务,自己进入终止状态,这的确很简单。不过我们今天谈到的“优雅地终止线程”,不是自己终止自己,而是在一个线程 T1 中,终止线程 T2;这里所谓的“优雅”,指的是给 T2 一个机会料理后事...

[Java并发-22-并发设计模式] Thread-Per-Message 与 Worker Thread 模式

2019-07-12
阅读 5 分钟
2.2k
我们曾经把并发编程领域的问题总结为三个核心问题:分工、同步和互斥。其中,同步和互斥相关问题更多地源自微观,而分工问题则是源自宏观。我们解决问题,往往都是从宏观入手,同样,解决并发编程问题,首要问题也是解决宏观的分工问题。

[Java并发-21-并发设计模式] Balking模式:线程安全的单例模式

2019-07-12
阅读 3 分钟
1.5k
上一篇文章中,我们提到可以用“多线程版本的 if”来理解 Guarded Suspension 模式,不同于单线程中的 if,这个“多线程版本的 if”是需要等待的,而且还很执着,必须要等到条件为真。但很显然这个世界,不是所有场景都需要这么执着,有时候我们还需要快速放弃。

[Java并发-20-并发设计模式] Guarded Suspension模式:等待唤醒机制的规范实现

2019-07-09
阅读 5 分钟
2k
在开发中我们或许回遇到这样的情况:有一个Web 版的文件浏览器,通过它用户可以在浏览器里查看服务器上的目录和文件。这个项目依赖运维部门提供的文件浏览服务,而这个文件浏览服务只支持消息队列(MQ)方式接入。消息队列在互联网大厂中用的非常多,主要用作流量削峰和系统解耦。在这种接入方式中,发送消息和消费结果...

[Java并发-19-并发设计模式] ThreadLocal | 线程本地存储模式

2019-07-09
阅读 5 分钟
3.1k
我们曾经重复说到,多个线程同时读写同一共享变量存在并发问题。前面两篇文章我们突破的是写,没有写操作自然没有并发问题了。其实还可以突破共享变量,没有共享变量也不会有并发问题。

[Java并发-18-并发设计模式] COW模式:Copy-on-Write模式的应用领域

2019-07-04
阅读 3 分钟
2.5k
在上一篇文章中我们讲到 Java 里 String 这个类在实现 replace() 方法的时候,并没有更改原字符串里面 value[] 数组的内容,而是创建了一个新字符串,这种方法在解决不可变对象的修改问题时经常用到。如果你深入地思考这个方法,你会发现它本质上是一种Copy-on-Write 方法。所谓 Copy-on-Write,经常被缩写为 COW 或者 C...