- 博客(23)
- 收藏
- 关注
原创 Java学习路线
写在最前总是在找工作时,才感叹没有珍惜时间。16年毕业,到现在仍在外包公司堆业务。身边的童鞋混的好的升值加薪,进大平台,混的一般的回老家。相比较之下,自己几年都没进步,浪费了青春。不过,有压力就有动力,这一个多月的努力,让自己增长了不少的信心。最好的开始永远就是现在,所以趁着今天有空,把学习路线规划一下,然后就按照这个路线,跟着自己的节奏,一步步的走。虽然可能已经走得晚点,也许会走得慢些,但...
2019-09-23 20:12:17 174
原创 分析Spring中Bean的生命周期
写在最前从十一到现在两周,IOC部分源码读了一半多,是力气活,也是个精细活。全部写出来心有余力不足,所以找些重点写写。简述 bean 实例化之前Spring中不是启动容器时就开启bean的实例化进程,它首先会对资源进行读取并对bean进行初始化。Spring将资源的定义和资源的加载区分开,Resource定义了统一的资源,默认实现是AbstractResource,资源的加载由Resou...
2019-10-15 22:35:12 244
原创 了解ClassLoader
在读Spring源码时,比如DefaultResourceLoader,构造时需要传入ClassLoader。索性先搞清楚ClassLoader,再继续阅读源码。ClassLoader是用来加载Class的。它负责将Class的字节码形式转换成内存形式的Class对象。字节码可以来自磁盘文件的*.class,也可以是jar包里的*.class,也可以来自远程服务器提供的字节流,字节码本质是一...
2019-10-09 23:18:14 158
原创 LinkedList
LinkedList结构LinkedList是一个实现了List接口和Deque接口的双向链表。 LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口,使得LinkedList类也具有队列的特性; 另外LinkedList实现了Cloneable接口和Serializable接口。public class LinkedList<E> ...
2019-10-02 14:53:12 190
原创 ArrayList源码及扩容机制
之前有一次面试问:你知道ArrayList底层是如何实现的吗?答:底层是数组…安静了大概2s后,面试官抬头疑惑的看向了我,我对他笑了笑。那是一段时间很长的沉默,空气中充满了尴尬。我知道希望我继续说下去,但我选择笑着面对这份沉默。所以!了解底层原理也是很重要的,划重点,期末要考!ArrayList介绍ArrayList的底层是数组,相当于动态数组。与Java中的数组相比,它的容量能动...
2019-10-01 16:09:46 529
原创 ThreadLocal
先来看看Jdk1.8对ThreadLocal的解释:JDK1.8定义:当前类提供线程本地变量。这些变量不同于正常变量,而是访问这些变量的每一个线程,都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal通常是类中private static字段,期望与线程的某一个状态相关联(例如用户ID或事务ID)。简单的来说,ThreadLocal是线程的本地变量,不用线程访问同一个Thr...
2019-09-30 19:01:40 138
原创 B类树详解及B+树在Mysql索引的应用
写在最前一直不知道B树是什么,面试的时候也被问过Mysql索引。所以写写B类树中B树,B+树的定义和增删操作。最后为Mysql中索引对B+树的使用。B树的定义B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数。阶数表示一颗节点最多有多少个孩子节点,一般用字母m表示。当m=2时,就是常说的二叉查找树BST。一颗m阶的B树定义如下:每个节点最多有m-1个关键字...
2019-09-29 16:00:08 485
原创 堆排序
堆排序算法利用数据结构-堆的结构来执行快速排序。为了实现从最低到最高排序,堆排序首先将未排序的数组转换为最大堆,以便数组中的第一个元素最大。假设要排序的数组是:[ 5, 13, 2, 25, 7, 17, 20, 8, 4 ]首先将其转换为最大堆,如下所示:此时堆的内部数组为:[ 25, 13, 20, 8, 7, 17, 2, 5, 4 ]现在开始对堆进行排序操作将第一个...
2019-09-28 18:57:25 140
原创 数据结构-堆
堆是数组内部的二叉树,因此它不使用父/子指针。根据“堆属性”对堆进行排序,该“堆属性”确定树中节点的顺序。堆的常见用途:建立优先级队列。支持堆排序。快速计算集合的最小(或最大)元素。堆属性堆有两种:max-heap和min-heap,它们的存储树节点顺序不同。在最大堆中,父节点的值大于其每个子节点的值。在最小堆中,每个父节点的值都小于其子节点的值。这称为“堆属性”,对...
2019-09-28 18:55:17 218
原创 Java线程池源码解析
Java线程池基础传送门:Java线程池基础及AtomicIntegerJava线程池原理除了newScheduledThreadPool,其他线程池都是基于ThreadPoolExecutor实现的。线程池内部状态既然是线程池,必然存在生命周期:运行中,关闭,停止等。ThreadPoolExecutor是用AtomicInteger变量ctl前三位表示这个状态的,另外用了后29位表示线程...
2019-09-22 15:44:20 439
原创 Java线程池基础及AtomicInteger
线程池一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量(来源百度百科)Java1.5中,引入Executor框架把任务的提交和执...
2019-09-21 15:42:06 755
原创 Java内存模型
内存模型在多CPU系统上,每个CPU都有多级缓存,一般分为L1,L2,L3,正是因为这些缓存的存在,提供了数据的访问性能(CPU的处理速度大于硬盘速度),也减轻了数据总数的传输压力,同时也带来了一些挑战,比如两个CPU同时访问一个内存地址,会发什么什么?在什么条件下可以看到相同结果。这些都是需要去解决的。在CPU层面,内存模型的定义是充分必要的,其他CPU的写入操作对当前CPU是可见的,当前C...
2019-09-18 20:15:34 97
原创 ReentrantLock非公平锁与公平锁源码解析
这篇从源码入手,深入了解ReentrantLock的非公平锁和公平锁的实现过程。之前已经写过ReentrantLock-基础,ReentrantLock的实现基于AQS,所以还需要先了解同步器AbstractQueueSynchronizer。非公平锁 ReentrantLock lock = new ReentrantLock(false); try { lock.l...
2019-09-15 17:44:41 184
原创 ReentrantLock-基础
在JDK中独占锁的实现除了内部锁Synchronized,还可以使用ReentrantLock。内部锁与可重入锁的对比在JDK1.6以后,性能上两者差距已经不明显,因为对synchronized底层进行了优化,很多地方采用了CAS操作。在Java虚拟机上更偏向于内部锁的使用,官方也提倡在满足条件的情况下,优先选择内部锁。两者都是独占锁,只允许一个线程进入临界区。synchronized的加...
2019-09-15 15:08:02 137
原创 同步器AbstractQueueSynchronizer
写在最前在Jdk1.5之后,并发包中新增了Lock接口用来实现锁的功能,它提供了与synchronized关键字类似的同步功能。在Lock的实现类中,常用的ReetrantLock、ReadWriteLock,内部实现都依赖于AQS类(线程排队),AQS是为Java并发同步机制提供的底层支持。所以在了解ReetrantLock之前,先学习AQS的内部原理。AQS定义public abstra...
2019-09-11 19:39:25 226
原创 内置锁synchronized原理解析
写在最前内置锁是JVM提供的最便捷的线程同步工具,在代码块或方法声明上添加synchronized关键字即可使用内置锁。最开始学习多线程时,遇到多线程并发问题就是使用synchronized,后来发现synchronized关键字并不那么灵活。为了解决synchronized笨重的问题,JDK1.5中加入了java.util.concurrent.locks 包。JDK1.6中对synchro...
2019-09-09 08:48:33 820
原创 Java线程实现和线程状态
写在最前之前写了ConcurrentHashMap,无论是1.8还是1.7,其中都会涉及锁Synchronized和ReentrantLock;锁的概念是为了解决线程安全问题;所以还是从线程开始写起。这篇文章主要是写写Java线程的实现和线程的状态,以及上下文的概念,也有一些不完善的地方,会持续查缺补漏。Java线程的实现Java线程模型是基于操作系统原生线程模型的实现,在JDK中,win...
2019-09-07 14:20:00 1339 1
原创 ConCurrentHashMap的深入了解
简介通过之前学习HashMap,知道在多线程环境下,同时进行HashMap的put操作时,可能造成死循环,所以需要一个更安全的Map在多线程环境下使用。了解HashMap传送门:HashMap的深入了解HashTable作为一个历史遗留类,所有线程去竞争同一把锁。当一个线程访问HashTable时,其他线程访问HashTable同步方法,就会进入等待或轮训状态,效率极其低下。在 JDK1....
2019-09-03 19:11:44 309
原创 HashSet源码解析
HashSet简介HashSet继承了AbstractCollection,是Set的一个实现类。HashSet实现了Cloneable接口,可以使用clone()方法进行自我复制;也可以使用迭代器方式进行遍历;实现了Serializable接口,可以直接使用IO流进行读写操作。在HashSet的实现中,最主要的就是做了一件事,它的内部封装了一个HashMap和傀儡对象,利用HashMap中...
2019-09-01 12:30:49 158
原创 HashMap的深入了解
HashMap在日常开发中使用频率非常高的用于键值对处理的数据类型。在JDK1.8中,对HashMap底层进行了优化,引入了红黑树的数据结构和扩容的优化,在这里就深入了解一下HashMap的结构实现和功能原理。深入了解这些特点,对工作编码(面试)有很大的帮助,当需要遍历HashMap的时候,使用map.entrySet(),显得逼格高一点(大笑)。Map映射简介Java为数据结构中映射定义了一...
2019-08-31 17:14:27 284
原创 从源码出发,理解SpringMVC
写在最前一边读源码,一边写理解。连续写了一周,终于大概搞定了。之前想一次性就搞定的,后来发现自己想的太简单了。所以准备之后再写写HandlerMapping、handlerAdapter以及ViewResolver。写的过程有些痛苦,写完收获很大,推荐将SpringMVC作为源码阅读的起点。一、认识SpringMVCMVC模式是什么?MVC模式是一种架构模式,用于将代码在数据、逻...
2019-08-29 20:04:58 114
原创 二叉树与红黑树
二叉查找树BST二叉查找树就是一颗二叉树,他的左节点比父节点要小,右节点比父节点要大。他的高度决定的查找效率。理想状态下,二叉树的增删改查的时间复杂度为O(LogN),最坏的情况为O(N)。当他的高度为LogN+1时,我们说二叉查找树是平衡的。下面盗图几张。T key = a search key; //查找的值Node root = point to the root of a bst;...
2019-08-29 19:57:37 317
原创 ThreadLocal原理
看了好多对于ThreadLocal的介绍,一直在似懂非懂,迷迷糊糊之间徘徊,后来自己用笔画了画,终于算是脱离了晕晕乎乎的状态,所以绝对自己来写一篇对于ThreadLocal的介绍。首先,明确ThreadLocal这个对象,他是一个线程本地变量,注意,他是一个变量,而不是一个线程,记住并理解这一点很重要,他是下文所有的基础,如果把他和Thread混淆,那么就走进了一个弯路,之前我就是走进了弯路,废...
2018-11-16 10:48:34 135
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人