- 博客(12)
- 收藏
- 关注
原创 ThreadLocal的理解
ThreadLocal原理ThreadLocal 就是个空壳,本质类似于Map键值对中的一个Key每个线程对象中,有一个类型为ThreadLocalMap的threadLocals变量。存储数据时,把这个ThreadLocal最为key,value就是你要存的数据存到这个线程的这个变量中。这就是为什么它能在多线程做到能隔离的效果。内存泄漏问题这个其实要和Java的GC机制有关。Java线程中的这个threadLocals变量,可以看成一个map,它这个key便是对ThreadLocal的一个弱引用
2021-03-29 09:17:13
75
原创 树结构笔记
几种树二叉搜索树:左小右大,中序遍历即为升序平衡二叉树:二叉搜索树的基础上增加了平衡的概念,即左右子树高度相差不超过1,这样有效的降低了二叉树的高度红黑树:弱化了平衡二叉树的绝对平衡,只追求所有路径相差不会超过一倍,由它所有路径拥有相同数量的黑色节点这一特性决定。注:平衡二叉树相比红黑树,查询效率会更高点,因为绝对平衡的深度肯定不会大于红黑树的深度。但是插入和删除的效率要比红黑树来的低下,以为要各种左旋、右旋等操作来维持平衡。-B树:平衡的多路查找树,相比前面的几种树,更加的“矮”,这里主要结合
2021-03-04 09:02:37
181
1
原创 Activiti笔记
1. 总体流程开始---->定义---->部署(deploy)---->拾取任务(候选人,分组)---->执行任务---->结束2. 三个主要操作接口 - RepositoryService 流程定义 - RuntimeService 流程部署 -TaskService 执行任务(complete)3. 三大网关排他网关-----多个任务满足条件可执行状态,只执行一个并行网关-----所有任务到达网关后执行下一步任务,类似Java障碍器Cyc
2020-10-22 15:52:34
119
原创 List重复添加同一对象
代码 User user=new User(); List<User> list = new ArrayList<>(); for(int i = 0; i < 3; i++){ user.setNameCode("nameCode:"+String.valueOf(i)); list.add(user); }结果[{"nameCode":"nameCode:2"}
2020-09-18 23:35:07
1854
原创 GC
GC回收的地方主要是在堆空间进行回收,Java8以后的元空间的回收暂时不谈!(堆分年轻代和老年代,年轻代分Eden和两个Survivor区域)1. 对象的可回收的判定方法1)引用计数器每个对象中有个引用计数器,每当被引用一次,计数器的数值加一。当计数器的值为0,则会被GC回收。基本不用这种方式作为判断对象是否能进行回收,因为如果出现两个对象互相引用,两个计数器的值不可能为0。2)可达性分析算法以GC Roots为根节点,比如A节点引用了这些根节点,然后B又引用了A,以此类推,形成一条链路,当某些
2020-09-03 22:06:13
90
原创 关于BufferedReader的读取效率
1. 一般情况正常采用readline读取,一行行读取。readline要注意阻塞的情况,当一行没有"/r"、"/n"、"/r/n"就会阻塞在那。 InputStreamReader isr = new InputStreamReader(connection.getInputStream(), "UTF-8"); in = new BufferedReader(isr); String line; whi
2020-09-02 14:16:33
1143
原创 JVM运行时数据区详解
一、五块区域程序计数器线程私有用于记录每个线程将程序执行到哪了,下一步该执行哪条字节码指令。注:如果执行的是一个java方法,计数器记录的是字节码指令的地址,如果是native方法,记录的值为空。本地方法栈线程私有本地方法栈存储一些navtive方法的信息,类似于虚拟机栈,虚拟机栈存储java方法的一些信息。虚拟机栈线程私有虚拟机栈中存储一个个栈帧,而栈帧存储着方法中的局部变量、操作数栈、动态链接、方法出口等信息。当线程调用一个方法时,就相当于一个栈帧入栈,可以理解为一个方法
2020-09-02 08:36:58
115
原创 mongoDB笔记
**1. mongoDB适用场景**存储的数据为json格式实时的DML操作(可以理解为因为使用缓存的缘故)大数据量的存储应用后续需要水平扩展数据模型不确定(可以理解为mongo对collection的结构不固定,这里collection的概念对应关系型数据库中的表概念)2.mongoDB为什么效率比Mysql高?采用基于内存映射的存储引擎。这里肯定对内存映射是什么很疑惑,一开始我也这样。内存映射简述:正常的对数据库进行查询数据,需要对数据进行两次复制,第一次复制,将数据从磁盘中拷贝
2020-08-19 10:21:44
171
原创 Nginx原理简述
Nginx原理简介1. nginx的作用反向代理(隐藏服务器的地址)负载均衡(轮询、权重、ip_hash)动静分离(nginx作为静态资源服务器)对nginx的主要操作都是在改配置文件。2.nginx原理nginx是以进程为单位的,这里是进程不是线程。每个进程有自己独立的资源,不用再像线程一样加锁了。如果你刚下载好了nginx,你启动之后,打开任务管理器看一下有几个nginx进程,如果不出意外,它会有两个nginx进程。为什么会有两个进程呢?原理解析nginx里面,有两
2020-08-17 08:30:26
349
原创 代码块以及构造方法执行顺序
有关静态代码块,构造代码块,main函数,构造函数,静态方法的执行顺序静态代码块是最先执行的,这里有可能会和静态方法联系起来,静态代码块和静态方法都会在类加载的时候,被加载,但是静态代码块会直接执行(且只执行一次,后面无论实例化多少对象,都只被执行一次),而静态方法不会被执行,静态方法要被调用才会执行。构造代码块和构造函数只有对象实例化的时候,才会执行且构造代码块在构造函数执行之前被执行。执...
2020-02-29 11:29:13
1076
原创 事务并发
事务1.事务的并发问题脏读:事务A读取了事务B跟新的数据,事务B回滚,导致A读的数据是错误的不可重复读:事务A多次读取同一行数据,事务B在事务A多次读取过程中,对数据进行了修改并提交,导致A读取的数据不同。(强调是行数据修改)幻读:事务A将整个表的所有行的数据都修改了一遍,而事务B,在其中又插入了一条新数据,A结束修改发现还有一条记录没修改,发生幻读。(强调行数据的新增和删除)2.M...
2020-02-16 13:34:25
232
原创 java多线程
多线程相关知识(浅)1.三种方法创建线程继承thread类实现接口runnable实现callable接口2.三种方法的区别thread是个类只能继承一个,不推荐用runnable是个接口,一个类可以实现多个接口,推荐使用callable与runnable最大的区别在于它有返回值,runnable没有3.实现同步的几种方式基于jvm的同步机制1.使用synchron...
2020-01-28 15:24:56
89
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人