
Java基础
文章平均质量分 88
pb_yan
这个作者很懒,什么都没留下…
展开
-
可重入锁源码分析
/** * 一个抽象类,是锁同步控制的基础。子类有公平锁和非公平锁两种。 */ abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = -5179523762034025860L; ...原创 2018-06-03 20:47:31 · 934 阅读 · 0 评论 -
AQS源码分析
AbstractQueuedSynchronized(AQS)是一个抽象的队列同步器,它本身是一个抽象类,提供一个FIFO的等待队列来存放阻塞资源和一个state状态来保存锁的信息。在实际的使用中,比如ReentrantLock和ReentrantReadWirteLock中,它们本身都有一个Syn类来继承AQS并做一些状态操作。 锁的使用过程大概如下,在实际使用锁的过程...原创 2018-06-07 21:14:19 · 466 阅读 · 0 评论 -
ReentrantReadWriteLock源码分析
ReentrantLock中,线程都是以独占的方式来获得锁,但是在很多情况下,比如读多写少的情况,使用独占的方式明显不合适,读和读之间不会修改共享资源,可以保证不会出现问题,这种情况下使用ReentrantReadWriteLock会更合适。读线程之间使用共享锁,写写和写读之间使用独占锁。ReentrantReadWriteLock的类结构如下图所示: 其中Syn实现了AQS中...原创 2018-06-05 20:53:14 · 461 阅读 · 0 评论 -
CopyOnWriteArrayList源码分析
如何线程安全的操作一个数组对象,类似于前面分析的ArrayBlockingQueue以及Vector,实际上都是使用加锁来实现,只不过第一个底层是使用ReentrantLock,第二个底层采用synchronized关键字来实现。对于任意一个线程访问数组,都会阻塞其他线程。但是实际上对于一个数组来说,当我们并发的去读的时候是不会出现并发问题的,因此如果可以在并发读的情况下不加锁,而在...原创 2018-06-12 21:57:23 · 163 阅读 · 0 评论 -
Java 高并发程序设计 读书笔记
高并发程序设计这本书从浅入深,首先从并发的基础概念(同步异步、并发并行等等)开始,让读者对于并发有一个比较浅显的认识,然后讲述了并行程序的基础——线程,这里主要讲了一下线程的相关状态和相关的操作,然后提了几个可能会因为线程而出问题的错误。接下来讲了一下Java中比较常用的并发包里的类,包括锁、线程池、以及一些并发容器。第四章介绍了一些有关锁的概念以及如何通过优化锁来提高性能,比如锁粗化、...原创 2018-05-24 22:13:39 · 243 阅读 · 0 评论 -
BlockingQueue接口及其实现类的源码分析
BlockingQueue是一个阻塞队列的接口,提供了一系列的接口方法。其中方法主要可以分为三类,包括Insert相关的add、offer、put,remove相关的remove()、poll()、take()方法,以及查看相关的peek()、element方法等。阻塞队列是线程安全的容器,其元素不允许为null,否则会抛出空指针异常。阻塞队列可以用于生产者消费者场景中去。 ...原创 2018-06-11 22:09:17 · 264 阅读 · 0 评论 -
AtomicLong、AtomicIntger源码分析
Atomic原子包下大概可以分成三类,AtomicInteger、AtomicLong、AtomicBoolean这三个是类似的,这里只写一下AtomicLong相关源码。 Atomic包是基于CAS实现的,CAS需要三个值,分别是要更新的值V,期望值E和新值N。当且仅当V和E相等的时候才可以使用新值对V进行替换,当发生冲突时就循环此过程知道成功为止。CAS是基于UNSAFE这个类实...原创 2018-05-28 20:49:07 · 564 阅读 · 0 评论 -
LinkedList源码分析 (1.8)
LinkedList也是Java容器中比较简单的存在,它的底层是采用双向链表来实现的。常用的LinkedList方法主要包括下面这些。add,addFirst,addLast(添加元素,在首部添加元素,在尾部添加元素),get,getFirst,getLast(获取元素,获取首部元素,获取尾部元素),indexOf,lastIndexOf(返回指定元素出现第一次的索引,置顶元素出现最...原创 2018-05-08 19:52:24 · 400 阅读 · 0 评论 -
ArrayList 源码分析 (相差无几的1.7和1.8)
ArrayList是Java容器中相对比较简单的一个,它底层是采用数组实现的,包括的主要操作有remove 、set、contains、clear、add、clone、indexOf、toString等等常用的方法,下面来简单分析一下这些方法的实现,有些实在是比较简单的就不写了。ArrayList重要参数及构造方法 /** * 默认容量为10 */ pr...原创 2018-05-07 22:21:08 · 1540 阅读 · 0 评论 -
从Java编程思想看Java体系结构
Java编程思想中的章节一共有22章,除了图形界面那一章之外,其他的可以简单的分为三大类,主要包括Java的核心语言基础、面向对象的有关特性和开发相关。这也是Java体系结构的组成部分。下面来细细划分三大类,并由此管窥Java体系结构。 Java语言核心基础 语言特性相关或者说是通用语言相关的部分又可以以下七个部分。 操作符 Java中的操作符主要包括+,-...原创 2018-05-07 20:36:11 · 280 阅读 · 0 评论 -
HashMap源码分析
HashMap概述 HashMap用于存储键值对,底层继承了AbstractMap类并实现了Map接口,Cloneable接口,以及Serializable接口。其数据结构的底层是一个Table数组,数组中存放的是Entry节点。 Entry是一个静态内部类,实现了Map.Entry接口,主要参数是key(对应HashMap中的key值),value(对应HashMa...原创 2018-04-28 18:52:18 · 206 阅读 · 0 评论 -
HashSet和TreeSet源码分析
Set是一个常见接口,用来保存不同的元素。常用的实现了Set接口的类有HashSet,TreeSet。一个底层基于HashMap实现,另一个基于TreeMap实现,理解了上述两个Map之后分析Set源码就比较简单了。HashSet源码分析 hashset 基于HashMap实现,把传入的值作为HashMap的key,由于底层HashMap的key是不可能重复的,因此HashSet也是不...原创 2018-05-18 20:53:26 · 389 阅读 · 0 评论 -
TreeMap 源码分析
TreeMap中重要参数及结构 /** * treemap中包含一个比较器,可以用来定义顺序 */ private final Comparator<? super K> comparator; private transient Entry<K,V> root; /** * 树中键值对的个数 */...原创 2018-05-18 13:04:52 · 176 阅读 · 0 评论 -
线程池工作原理及源码分析
试试原创 2018-06-24 15:31:36 · 1359 阅读 · 0 评论