JDK源码分析
文章平均质量分 82
石头dhf
三人行必有吾师!
展开
-
史上最清晰的红黑树讲解(上)
本文github地址本文以Java TreeMap为例,从源代码层面,结合详细的图解,剥茧抽丝地讲解红黑树(Red-Black tree)的插入,删除以及由此产生的调整过程。总体介绍Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也转载 2017-08-01 11:28:06 · 254 阅读 · 0 评论 -
FutureTask和Callable源码解析
通过Future和Callable可以实现异步计算框架,实现流程如下:1、实现Callable接口里的call方法。2、FutureTask(Callable callable)new FutureTask 3、Thread(FutureTask ).start启动线程4、FutureTask的get()方法阻塞式得到结果。二、源码分析//通过下面可以看到:FutureTask实现了R原创 2018-03-13 23:24:40 · 363 阅读 · 0 评论 -
关于Java中String类的hashCode方法
首先来看一下String中hashCode方法的实现源码 1 public int hashCode() { 2 int h = hash; 3 if (h == 0 && value.length > 0) { 4 char val[] = value; 5 6 for (int i = 0; i ) { 7转载 2018-03-14 09:57:36 · 234 阅读 · 0 评论 -
Java中的String为什么是不可变的? -- String源码分析
转载:http://blog.csdn.net/zhangjg_blog/article/details/18319521什么是不可变对象?众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用...转载 2018-03-14 10:18:23 · 151 阅读 · 0 评论 -
详解Java中的clone方法 — 原型模式
装载:http://www.importnew.com/22035.htmlJava中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?1 使用new操作符创建一个对象2转载 2018-03-14 11:40:33 · 159 阅读 · 0 评论 -
AtomicInteger源码解析
AtomicInteger,由于存储的值的value是volatile类型所有具有线程可见性。通过CAS比较交换进行自增,或者更新值具有原子性。所以AtomicInteger是线程安全的具有类锁一样的线程安全性。具体参见下面源码解析: private static final Unsafe unsafe = Unsafe.getUnsafe(); private static fina...原创 2018-03-14 15:45:37 · 124 阅读 · 0 评论 -
【java】Integer == Integer?
/** *Q:Integer和Integer对象用 == 进行比较的过程是怎样的? * *看例子 */ public class Test { public static void main(String[] args) { int a = 1; int b = 1; Integer c = 3; I...转载 2018-05-16 15:52:57 · 2791 阅读 · 1 评论 -
Java集合:HashMap源码剖析
转载:http://www.cnblogs.com/ITtangtang/p/3948406.html一、HashMap概述 HashMap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 值...转载 2018-06-23 11:24:27 · 105 阅读 · 0 评论 -
深入分析 ThreadLocal 内存泄漏问题
前言ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用 ThreadLocal,就可能会导致内存泄漏。下面,我们将围绕三个方面来分析 ThreadLocal 内存泄漏的问题ThreadLocal 实现原理ThreadLocal为什么会内存泄漏ThreadLocal 最佳实践Thread...转载 2018-06-17 16:13:48 · 148 阅读 · 0 评论 -
LinkedList源码解析
双端链表,可以正向和反向遍历链表,提升了遍历的效率。可以实现队列和栈的数据结构。1、在取链表中固定位置中的一个值时,因为链表结构需要进行遍历。会分析要取的位置在链表的前半部分还是后半部分??如果前半部分通过head进行往后遍历,如果为后半部分通过尾部向前进行遍历。这样提高了效率。 private Entry<E> entry(int index) { if (ind...原创 2018-07-10 10:52:35 · 95 阅读 · 0 评论 -
集合Arraylist分析
arrylist采用数组存储元素。默认初始化为10长度的数组。在添加元素时先判断是否需要扩容,扩容为 (old*3)/2+1在遍历元素时,首先创建iterator会保存modcount,在获取next元素时会提交现在的modcount和原来记录的是否相等,如果不相等,抛出ConcurrentModificationExceptinon异常。arrylist是非线程安全的。...原创 2018-07-10 11:23:36 · 103 阅读 · 0 评论 -
Vector集合源码解读
1、Vector和Arraylist一样也是基于数组的,但是它是安全的。2、默认创建大小为10个数组,可以指定初始数组大小和扩容步长大小。3、如果指定扩容步长大小,在添加元素时扩容为步长大小,否则扩容为原来大小的2倍。4、Vector是线程的安全的,方法通过synchronized修饰。...原创 2018-07-10 11:35:41 · 93 阅读 · 0 评论 -
stack集合分析
1、stack继承Vector,实现了LIFO算法的栈数据结构。class Stack<E> extends Vector<E> {2、push入栈,放到数组最后。 public E push(E item) { addElement(item); return item; }3、pop出栈:获取元素总长度,通过peek取数组尾部元素,然后再通过remove移除...原创 2018-07-10 11:49:38 · 488 阅读 · 0 评论 -
HashSet集合解读
1、Hashset是基于依赖HashMap实现的,把元素作为key,默认object作为value形成键值对。所有Hashset是非线程安全的,元素不可以重复。public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializabl...原创 2018-07-10 12:01:18 · 170 阅读 · 0 评论 -
TreeMap集合解析
1、TreeMap是一个支持排序的Map实现。要求其key实现Comparable接口或者创建自身时传入Comparable接口实现。内部Entry对象: static final class Entry<K,V> implements Map.Entry<K,V> { K key; V value; Entry<K,V> le...转载 2018-07-10 15:53:49 · 191 阅读 · 0 评论 -
Hashtable多线程遍历问题
If a thread-safe implementation is not needed, it is recommended to use HashMap in place of code Hashtable. If a thread-safe highly-concurrent implementation is desired, then it is recommended to use...转载 2018-07-06 11:45:32 · 1966 阅读 · 0 评论 -
HashtTable源码解读
每一次打击都是为了更好的提高,加油!hashTable默认情况下大小为11。int index = (hash & 0x7FFFFFFF) % tab.length; hashtable,为什么???因为: 0x7FFFFFFF 是0111 1111 1111 1111 1111 1111 1111 1111:除符号位外的所有1。 (hash & 0x7...原创 2018-07-06 11:48:48 · 388 阅读 · 1 评论 -
Proxy动态代理应用、源码分析
注:1、Java的动态代理是基于接口的,如果类未实现接口是不能进行代理的,需要使用CGlib方式。前言代理是java中非常重要的一种设计模式 ,动态代理则是是一种代理模式的最佳实践,本文将由浅及深的介绍动态代理及其proxy源码分析,文章写的不一定都对,请各位看官带着批判的态度阅读此文章.代理模式是设计模式中的一种,而且在实际的开发中使用的频率非常高 ,比如spring AOP,mybatis代理...转载 2018-03-23 12:21:08 · 398 阅读 · 0 评论 -
【Java 并发】详解 ThreadLocal
目录前言线程局部变量使用示例具体实现ThreadLocalMap副本变量存取ThreadLocal 散列值应用场景参考文章 前言ThreadLocal 主要用来提供线程局部变量,也就是变量只对当前线程可见,本文主要记录一下对于 ThreadLocal 的理解。更多关于 Java 多线程的文章可以转到 这里。线程局部变量在多线程环境下,之所以会有并发问题,就是因为不同的线程会同时访问同一个共享变量,...原创 2018-03-22 22:19:25 · 125 阅读 · 0 评论 -
《Thinking In Algorithm》06.Binary search tree(二叉查找树)
The search tree data structure supports many dynamic-set operations, includingSEARCH,MINIMUM,MAXIMUM,PREDECESSOR,SUCCESSOR,INSERT, andDELETE. Thus, we can use a search tree both as a dictionary and转载 2017-07-31 21:10:07 · 261 阅读 · 0 评论 -
HashMap JDK9源码解读
1、属性值 static final int DEFAULT_INITIAL_CAPACITY = 1 static final int MAXIMUM_CAPACITY = 1 static final float DEFAULT_LOAD_FACTOR = 0.75f; /** * The bin count threshold for usi原创 2017-10-08 09:36:10 · 1244 阅读 · 0 评论 -
ArrayList迭代过程删除问题
一:首先看下几个ArrayList循环过程删除元素的方法(一下内容均基于jdk7):package list;import java.util.ArrayList;import java.util.Arrays;import java.util.Iterator;import java.util.List;import java.util.prefs.Preferences;转载 2018-01-27 11:33:02 · 394 阅读 · 0 评论 -
ConcurrentHashMap是弱一致的
本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知识。happens-before相关内容参见:JLS §17.4.5. Happens-before Order、深入理解Java内存模型以及Happens before;ConcurrentHashMap的详细介绍以及底层原理见深入分析ConcurrentH...转载 2018-01-27 16:34:21 · 665 阅读 · 0 评论 -
ArrayBlockingQueue源码解析
ArrayBlockingQueue通过数组进行存储。通过标记putIndex实现进行找到添加入队元素位置;通过标记takeIndex进行找到出队元素位置;通过count记录队列元素,如果count=数组的长度则队列已经满,如果count=0则队列为空的。如果队列入队标记位置已经到数组末尾则从数组头开始。---这样进行循环如果队列出队标记位置已经到数组末尾则从数组头开始。---这样进行循环原创 2018-01-27 23:24:21 · 126 阅读 · 0 评论 -
彻头彻尾理解 LinkedHashMap
转载:http://blog.csdn.net/justloveyou_/article/details/71713781摘要: HashMap和双向链表合二为一即是LinkedHashMap。所谓LinkedHashMap,其落脚点在HashMap,因此更准确地说,它是一个将所有Entry节点链入一个双向链表的HashMap。由于LinkedHashMap是HashMap的子类,所以Linke...转载 2018-03-07 22:44:04 · 512 阅读 · 0 评论 -
ScheduledThreadPoolExecutor源码解析
一、概述ScheduledThreadPoolExecutor继承了ThreadPoolExecutor;内部扩展了任务的ScheduledFutureTask类实现运行任务后修改下一次执行时间;对队列内部采用了再次继承封装的DelayQueue队列,运用了DelayQueue队列的添加排序特性根据最先运行时间进行排序,运用了DelayQueue只有在延迟期满时才能从中提取元素,并且该队列的头部 ...原创 2018-03-14 22:00:37 · 236 阅读 · 0 评论 -
Java 并发AQS注解
一、waitStatus属性: 在AQS的Node中有每个Node自己的状态(waitStatus),我们这里归纳一下,分别包含:SIGNAL 从前面的代码状态转换可以看得出是前面有线程在运行,需要前面线程结束后,调用unpark()方法才能激活自己,值为:-1CANCELLED 当AQS发起取消或fullyRelease()时,会是这个状态。值为1,也是几个状态中唯一一个大于0的状态,所以前面判...原创 2018-02-28 18:26:16 · 373 阅读 · 0 评论 -
ReenTrantReadWriteLock源码分析
1、读写状态设计,低十六位代表写,高16位代表读.ReentrantLock中,我们知道锁的状态是保存在Sync实例的state字段中的(继承自父类AQS),现在有了读写两把锁,然而可以看到还是只有一个Sync实例,那么一个Sync实例的state是如何同时保存两把锁的状态的呢?答案就是用了位分隔:state字段是32位的int,读写锁用state的低16位保存写锁(独占锁)的状态;高16位保存读...原创 2018-03-01 12:11:45 · 219 阅读 · 0 评论 -
CopyOnWriteArrayList源码分析
1、注解:是ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。这一般需要很大的开销,但是当遍历操作的数量大大超过可变操作的数量时,这种方法可能比其他替代方法更 有效。在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时,它也很有用。“快照”风格的迭代器方法在创建迭代器时使用了对数组状态的引用。此数组在迭代器的生存期内不...原创 2018-03-08 21:10:35 · 125 阅读 · 0 评论 -
Java ConCurrentHashMap原理总结
Java ConCurrentHashMap原理总结ConCurrentHashMap采用锁分段技术提高了并发访问效率。它由segment数组和HashEntry数组组成。segment是采用了可重入锁,在map里扮演锁的角色;HashEntry则存储键值对数据。存储结构图如下:get取数据操作:1)、定位segment:通过key的hash值进行再hash,取再hash值得高位与(segemen...原创 2017-08-14 22:09:47 · 327 阅读 · 0 评论 -
DelayQueue源码解析
Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部 是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且 poll 将返回 null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于等于 0 的值时,将发生到期。即使无法使用 take 或 poll 移除未到期的元素。 ...原创 2018-03-15 17:26:36 · 250 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码分析之条件队列-Condition
public final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException();//添加到队尾,添加时移除失效节点。/*在addConditionWaiter方法中,如果发现条件队列尾结点已取消就...原创 2018-03-01 16:36:27 · 259 阅读 · 0 评论 -
Java集合---ConcurrentHashMap原理分析
集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获益非浅...转载 2017-08-14 23:10:18 · 193 阅读 · 0 评论 -
HashMap的工作原理
转载:http://www.importnew.com/7099.html本文由 ImportNew - 唐小娟 翻译自 Javarevisited。欢迎加入翻译小组。转载请见文末要求。HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为...转载 2018-03-16 17:10:09 · 123 阅读 · 0 评论 -
ThreadPoolExecutor线程池源码解析
关键构造属性: volatile int runState; 保证了多线程的共享可见性 static final int RUNNING = 0; static final int SHUTDOWN = 1; 运行了SHUTDOWN static final int STOP = 2; ...原创 2018-03-12 23:50:43 · 433 阅读 · 0 评论 -
Java多线程系列--“基础篇”08之 join()
本章,会对Thread中join()方法进行介绍。涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例转载请注明出处:http://www.cnblogs.com/skywang12345/p/3479275.html 1. join()介绍join() 定义在Thread.java中。join() 的作用:让“主线程”等待“子线程...转载 2018-07-06 12:38:36 · 143 阅读 · 0 评论