
Java
文章平均质量分 88
ItsJingdai
这个作者很懒,什么都没留下…
展开
-
ThreadLocal源码分析总结
ThreadLocal源码分析总结@author:Jingdai@date:2021.07.25上篇分析了ThreadLocalMap的源码,这篇继续分析ThreadLocal的源码。本文将会分析ThreadLocal的源码、内存泄露问题及 ThreadLocal 和线程池结合使用的问题。简介ThreadLocal 用来创建线程局部变量,使每个线程有自己独立的变量副本,不会有线程安全问题。ThreadLocal 通常定义为private static 的属性,用以存储与线程相关联的状态(如us原创 2021-07-25 00:03:35 · 119 阅读 · 2 评论 -
ThreadLocalMap源码分析总结
ThreadLocalMap源码分析总结@author:Jingdai@date:2021.07.23网上关于ThreadLocal的介绍非常多,但是想理解ThreadLocal,ThreadLocalMap是绕不开的,这篇文章从源码的角度分析ThreadLocalMap。作者水平有限,不免有理解错误之处,欢迎讨论。同时,读这篇文章前希望有一点点ThreadLocal的理解,否则可能不太容易懂。简介ThreadLocalMap 是一个Map,不同于 HashMap,它没有实现 Map 接口,也原创 2021-07-23 22:01:02 · 232 阅读 · 0 评论 -
AQS源码分析总结(2)
AQS源码分析总结(2)@author:Jingdai@date:2021.07.20上一篇介绍了 acquire 和 release 方法的详细流程,这两个方法都是对同步队列进行操作的,AQS 框架中还有一个重要的队列,就是条件队列,这篇文章将介绍 AQS 的条件队列及其相关的操作。整体思路当调用 AQS 的 await 方法时,AQS 就会把当前线程加入到对应的条件队列中去等待。等其他的线程调用 signal 方法时,就会把这个线程从条件队列中移出,放入同步队列中。条件队列的设计思路和原创 2021-07-20 23:11:44 · 206 阅读 · 2 评论 -
AQS源码分析总结(1)
AQS源码分析总结(1)@author:Jingdai@date:2021.07.20最近研究了一下AQS源码,记录一下,水平有限,不免理解有错,欢迎讨论指正。整体思路AQS是一个提供了简化同步类设计的框架,利用AQS可以比较容易的实现同步和互斥等功能。AQS主要就是利用一个同步状态 state 来表示目前的同步状态,AQS负责管理这个同步状态。当线程无法得到同步资源时,需要将线程加入同步队列中,所以AQS 还负责管理一个同步队列。加入同步队列的同时,也涉及到线程的阻塞和唤醒,所以 AQS原创 2021-07-20 21:51:33 · 208 阅读 · 1 评论 -
JDK7的ConcurrentHashMap源码分析总结
JDK7的ConcurrentHashMap源码分析总结@author:Jingdai@date:2021.07.15花了一天多时间把JDK7的ConcurrentHashMap源码研究了一下,现总结如下。由于水平有限,不免有错误,欢迎大佬指正。整体思路ConcurrentHashMap名字太长,后文用CHM代替。不同于HashTable用一把锁加锁所有的桶,CHM使用分段锁,每次加锁只锁整个Map的一部分,这样就大大提高了并发量,当不同的线程想同时修改CHM的不同部分时,不会阻塞。CHM中用原创 2021-07-15 22:30:06 · 264 阅读 · 1 评论 -
JDK动态代理原理
JDK动态代理原理@author:Jingdai@date:2021.05.03接上篇,记录一些学习JDK动态代理的知识点。1.JVM生成的动态代理类都是Proxy的子类Java8 API原句:Proxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by t原创 2021-05-03 11:21:42 · 161 阅读 · 1 评论 -
Java静态代理和动态代理
Java静态代理和动态代理@author:Jingdai@date:2021.05.03代理模式为目标对象提供(包装)一个代理,这个代理可以控制对目标对象的访问。通过代理对象调用目标对象代理对象可以添加监控和审查处理静态代理代理类和目标对象都要实现同一个接口,同时,代理对象需要持有目标对象,外界需要调用目标对象时,直接调用代理对象。同时,代理对象在调用时可以增加一些前置处理和后置处理。下面是一个例子。接口package proxy;// interfacepublic inte原创 2021-05-03 11:18:22 · 168 阅读 · 0 评论 -
HashMap的循环链表图解
HashMap的循环链表图解@author:Jingdai@date:2021.03.20复习HashMap的知识点,总是看到jdk1.7前在多线程操作时可能会出现循环链表问题,不是很理解,于是研究源码并画图终于搞懂,记录一下。由于本人电脑只有jdk1.5和jdk1.8,所以以下分析均基于jdk1.5,jdk1.7应该一样。循环链表发生的地方循环链表发生在多个线程同时对HashMap进行put操作使HashMap 扩容的时候。下面看代码。public V put(K key, V valu原创 2021-03-20 15:43:57 · 5490 阅读 · 3 评论 -
Java ThreadPoolExecutor 类参数讲解
Java ThreadPoolExecutor@author:Jingdai@date:2020.11.03最近看《Java并发编程实战》这本书,书中经常出现 ThreadPoolExecutor ,而自己对这个类不是很熟悉,学习了一下,简要总结一下。基本概念ThreadPoolExecutor 这个类是一个线程池,之前看《 Java核心技术·卷1》这本书,里面有介绍可以用 Executors 类中的静态方法创建线程池,比如 Executors.newCachedThreadPool() 方原创 2020-11-03 17:06:02 · 207 阅读 · 0 评论 -
NoSuchElementException 异常问题
NoSuchElementException 异常问题@author:Jingdai@date:2020.10.11今天刷 LeetCode 遇到 NoSuchElementException 问题,找了半天发现是因为对一个空的链表进行 getFirst() 操作造成的,现记录一下。查看 Java API 发现对空链表调用 getFirst() 、 getLast() 、 removeFirst() 、 removeLast() 、 element() 、 remove() 、 pop() 方法时原创 2020-10-11 09:35:09 · 1800 阅读 · 0 评论 -
Java 中断线程(interrupt)超详细讲解
Java 中断线程(interrupt)@author:Jingdai@date:2020.10.06概念当 A 线程想让 B 线程终止运行,应该怎么办呢?在Java之前的版本中,可以利用 stop 方法来使一个线程终止,但是该方法已经被废弃了,不要这么用。现在可以在 A 线程中调用 B 线程的 interrupt() 方法,来使 B 线程知道有线程想要使自己终止,但是是否终止取决于 B 线程自己,B 完全可以不理会这个终止请求。(当然最好不要这么做)下面我们来看看细节。相关函数介绍v原创 2020-10-06 20:23:50 · 1566 阅读 · 0 评论 -
Java 三目运算符细节详解
Java 三目运算符细节详解@author:Jingdai@date:2020.09.24看到标题你肯定觉得三目运算符有什么好讲的,不是很简单嘛。我之前也是这么认为的,直到今天刷LeetCode遇到了一点问题,发现还是有些细节自己不知道的,现总结一下。短路问题首先我们都知道Java中 && 和 || 的运算是具有短路效果的,如果逻辑运算符的第一部分能确定运算的结果,就不会再去计算逻辑运算符的第二部分,比如下面的代码,输出的 i 仍然是1,因为后面的运算短路了,没有计算。in原创 2020-09-24 19:47:38 · 4061 阅读 · 2 评论 -
Java 码点和代码单元
Java 码点和代码单元@date:2020.09.01@author:Jingdai概念码点(Code Point):与一个代码表中某个字符相对应的代码值。Unicode标准中,码点采用十六进制书写,并加上前缀U+,例如U+0041就是拉丁字母A的码点。Unicode的码点可以分为17个代码平面。第一个平面称为基本多语言平面,包括码点从U+0000到U+FFFF的经典Unicode代码;其余16个平面的码点从U+10000到U+10FFFF,包括辅助字符。代码单元(Code Unit原创 2020-09-01 20:49:53 · 459 阅读 · 0 评论 -
Java 函数式接口(Compartor多个抽象函数问题)
Java 函数式接口@author:Jingdai@date:2020.09.07概念任何只有一个抽象方法的接口都是函数式接口。自己定义函数式接口时,可以用 @FunctionalInterface 注解来标记这个接口,这么做有两个好处:编译器会检查,如果接口有不止一个的抽象方法,编译器会报错。javadoc 页会指出这个接口是一个函数式接口需要一个函数式接口的对象时,可以提供一个 lambda 表达式。不能将 lambda 表达式赋给 Object 类型的变量, Object原创 2020-09-07 21:22:14 · 782 阅读 · 0 评论 -
Java 枚举(实例讲解)
Java 枚举@author:Jingdai@date:2020.09.06概念枚举是特殊的常量类,构造方法默认强制为私有。(必须)枚举类型是 Enum 类的子类。Enum 类重写了 toString() 方法,返回枚举类中包含的该枚举常量的名称。使用 enum 创建枚举类的所有实例必须在枚举类的第一行显示列出。实例enum 关键字是 java1.5 引入的新特性,先看一下在 java1.5 之前,如何定义枚举。LightEnum.java// before java 1.5原创 2020-09-06 15:31:17 · 1291 阅读 · 0 评论 -
Java 权限修饰符(带测试)
Java 权限修饰符(带测试)@author:Jingdai@date:2020.09.04类的权限类的权限修饰符有两个:public/defaultpublic:全部可见default:包内的所有类可见方法、属性的权限方法、属性的权限修饰符有public、protected、default和private。public: 全部可见protected:包内的类可见、其它包内的子类可见default:包内的类可见private:本类可见实测protected在理解原创 2020-09-04 21:55:41 · 330 阅读 · 0 评论 -
Java 接口易错点
Java 接口@author:Jingdai@date:2020.09.04Tips接口中的方法自动是public的,所以不用提供public关键字,建议不要加。接口中的字段总是 public static final 的,建议不要加这些关键字。接口中不能有实例字段。接口的实现类实现的方法必须加 public 。拓展接口(通用性较高的接口拓展到专用性较高的接口)使用 extends 关键字。默认方法Java8中接口增加了默认方法,为接口方法提供一个默认实现,必须使用 def原创 2020-09-04 17:44:48 · 365 阅读 · 0 评论