JDK源码分析
文章平均质量分 95
JDK源码分析
一直不懂
笔记
展开
-
深入详解ThreadLocal内存泄漏问题
1. 造成内存泄漏的原因?threadLocal是为了解决对象不能被多线程共享访问的问题,通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中,这样每个线程使用自己的对象实例,彼此不会影响达到隔离的作用,从而就解决了对象在被共享访问带来线程安全问题。如果将同步机制和threadLocal做一个横向比较的话,同步机制就是通过控制线程访问共享对象的顺序,而threadLocal就是为每一个线程分配一个该对象,各用各的互不影响。打个比方说,现在有100个同学需转载 2022-01-13 11:50:24 · 2423 阅读 · 2 评论 -
Java URL协议实现扩展原理
URL(统一资源定位符)简单的说就是通过一简单字符串就能定位到唯一资源,在Java中使用URL类表示。URL能够解析出protocol、hostname、port等信息。 protocol决定了交互规范,通用的协议,比如HTTP、File、FTP等协议,JDK自带了默认的通讯实现。通过java.net.URL#openConnection()方法返回一个URLConnectio...原创 2019-12-14 14:48:38 · 3119 阅读 · 0 评论 -
Java 8系列之重新认识HashMap
HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要...转载 2019-06-30 19:11:17 · 167 阅读 · 0 评论 -
红黑树实现之TreeSet源码分析
总体介绍之所以把TreeSet和TreeMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说TreeSet里面有一个TreeMap(适配器模式)**。因此本文将重点分析TreeMap。JavaTreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natura...转载 2019-06-30 17:54:52 · 253 阅读 · 0 评论 -
深入理解Java线程池:ThreadPoolExecutor
线程池介绍在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。...转载 2019-07-12 18:41:18 · 325 阅读 · 0 评论 -
LinkedList源码分析
LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的。1、继承结构2、LinkedList数据结构如上图所示,LinkedList底层使用的双向链表结构,有一个头结点和一个尾结点,双向链表意味着我们可以从头开始正向遍历,或者是从尾开始逆向遍历,并且可以针对头部和尾部进行相应的操作。3、源码分析3.1、AbstractSequ...原创 2019-06-23 22:13:53 · 3119 阅读 · 0 评论 -
ArrayList源码分析
ArrayList是可以动态增长和缩减的索引序列,它是基于数组实现的List类。该类封装了一个动态再分配的Object[]数组,当向ArrayList中添加元素时,该属性值会自动增加。如果想ArrayList中添加大量元素,可使用ensureCapacity方法一次性增加capacity,可以减少增加重分配的次数提高性能。1、继承结构ArrayList通过继承AbstractList实...原创 2019-06-23 15:29:36 · 3250 阅读 · 0 评论 -
【JDK源码分析】04-使用Externalizable实现自定义序列化
上一篇讲到Serializable实现类定义私有的writeObject和readObject方法就能实现自定义序列化,但由于这两个方法是私有的,那就意味着子类序列化方法既不会继承,也不会覆盖。也就是说,对于整个继承层次中的类,都会从父类至子类依次调用序列化操作。但是有的时候,我们希望子类复用父类的序列化实现,又或者子类重写父类的序列化实现,那么这时候我们就需要用到java.io.External...原创 2018-03-14 14:51:42 · 202 阅读 · 0 评论 -
【JDK源码分析】03-对象自定义序列化
在前两篇文章中分析了序列化与反序列化的流程,下面说一下Serializable中如果定义private void writeObject(ObjectOutputStrean os)和private void readObject(ObjectInputStrean os)的作用也就是在《对象序列化》那篇文章中分析的ObjectStreamClass中定义的两个成员变量writeObjectMet...原创 2018-03-14 12:01:53 · 229 阅读 · 0 评论 -
【JDK源码分析】02-对象反序列化ObjectInputStream
上一篇文章《对象序列化ObjectOutputStream》描述了对象的序列化,下面我们分析一下对象的反序列化就知道了为啥枚举反序列化后还是单例,而普通类不可以。public ObjectInputStream(InputStream in) throws IOException { verifySubclass(); bin = new BlockDataInputStream(...原创 2018-03-11 23:19:37 · 849 阅读 · 0 评论 -
【JDK源码分析】01-对象序列化ObjectOutputStream
上一篇文章提到反序列化枚举类仍是单例,而普通类对象不是单例,下面我们先分析一下序列化过程,序列化就是调用ObjectOutStream的对象的writeObject方法。我们先看一下序列化涉及的比较重要的一个ObjectStreamClass,JDK中的描述是:类的序列化描述符。它包含类描述信息,字段的描述信息和 serialVersionUID。可以使用 lookup 方法找到/创建在此 Jav...原创 2018-03-10 00:00:52 · 1316 阅读 · 0 评论