摘要: 在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在JDK1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇介绍synchronized关键字的使用方式,区别和偏向锁、轻量锁和重量锁实现原理。 先看看synch 阅读全文
posted @ 2019-01-29 22:23 阳光、大地和诗歌 阅读(530) 评论(0) 推荐(0) 编辑
摘要: volatile关键字经常用来修饰变量。不过,volatile本身很容易被误用。本篇就介绍一下volatile的原理和使用方式。 在介绍volatile关键字原理前,我们首先要了解JVM运行时的内存分配逻辑。 对于成员变量i,它存储在堆内存中。每个线程在运行时都会有一个自己的线程栈,线程如果要访问类 阅读全文
posted @ 2019-01-23 15:23 阳光、大地和诗歌 阅读(466) 评论(0) 推荐(0) 编辑
摘要: 并发编程时,对于共享资源的使用需要确保绝对的安全性。除了利用锁机制之外,还有一种无锁的概念。所谓无锁,就是假定在并发情况下,对于共享资源的访问没有冲突,线程可以一直不停的运行,无需阻塞,如果产生冲突,则使用CAS算法确保安全性。Java在很多并发代码中都使用了这种算法。 CAS算法的核心参数如下: 阅读全文
posted @ 2019-01-22 23:03 阳光、大地和诗歌 阅读(728) 评论(0) 推荐(0) 编辑
摘要: ConcurrentHashMap和Hashtable都是线程安全的K-V型容器。本篇从源码入手,简要说明它们两者的实现原理和区别。 与HashMap类似,ConcurrentHashMap底层也是以数组+链表+红黑树实现的,以Node节点封装K-V和hash。 val和next以volatile关 阅读全文
posted @ 2019-01-21 21:23 阳光、大地和诗歌 阅读(327) 评论(0) 推荐(0) 编辑
摘要: HashSet为无序不可重复集合。底层几乎全部借助HashMap实现,比较简单。本篇简要分析一下HashSet源码。 首先是成员变量: 1、真正保存数据的HashMap实例 2、map实例的值 常用方法: 1、add() 从这个HashSet的add()方法中,可以看出。HashSet的不可重复,主 阅读全文
posted @ 2019-01-21 18:50 阳光、大地和诗歌 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 在JDK1.8中对HashMap的底层实现做了修改。本篇对HashMap源码从核心成员变量到常用方法进行分析。 HashMap数据结构如下: 先看成员变量: 1、底层存放数据的是Node<K,V>[]数组,数组初始化大小为16。 2、Node<K,V>[]数组最大容量 3、负载因子0.75。也就是如 阅读全文
posted @ 2019-01-21 18:28 阳光、大地和诗歌 阅读(292) 评论(0) 推荐(0) 编辑
摘要: LinkedList与ArrayList一样都是List接口的实现类,底层用双向链表实现。 LinkedList本身用一个内部类实现链表元素。 E item就是当前元素。next为下一个节点,prev为上一个节点。 主要方法分析: 1.add() 插入元素后,新建newNode节点,将newNode 阅读全文
posted @ 2019-01-17 11:31 阳光、大地和诗歌 阅读(130) 评论(0) 推荐(0) 编辑
摘要: ArrayList是开发常用的有序集合,底层为动态数组实现。可以插入null,并允许重复。 下面是源码中一些比较重要属性: 1、ArrayList默认大小10。 2、elementData就是真正存放数据的数组。elementData[]本身是动态的,并不是数组的全部空间都会使用,所以加上trans 阅读全文
posted @ 2019-01-17 10:44 阳光、大地和诗歌 阅读(281) 评论(0) 推荐(0) 编辑