- 博客(59)
- 资源 (5)
- 收藏
- 关注
原创 java并发编程原理3 (CountDownLatch,Semaphore,CopyOnWriteArrayList,ConcurrentHashMap)
CountDownLatch,Semaphore,CopyOnWriteArrayList,ConcurrentHashMap
2023-02-19 23:32:17 195
原创 springboot源码分析(一):启动过程
1、springboot的入口程序@SpringBootApplicationpublic class StartupApplication { public static void main(String[] args) { SpringApplication.run(StartupApplication.class, args); }}当程序开始执行之后,会调用SpringApplication的构造方法,进行某些初始参数的设置//创建一个新的实例,这个应用
2022-04-11 21:30:19 204
原创 分布式事务框架LCN使用、原理和源码阅读
官网: https://www.codingapi.com/docs/home/原理:来着官网使用:一个eureka。一个TM,两个RM,分别为订单服务和支付服务。具体详细配置请访问官网。订单服务Controller: @PostMapping("/add-order") @Transactional(rollbackFor = Exception.class) @LcnTransaction public String add(@RequestBody T
2021-11-07 22:50:58 215
原创 Tomcat和Nginx调优和配置
Nginx调优和配置静态资源配置:设置location 参数,配置匹配的规则,就是匹配哪些静态资源,然后设置路径。location ~ .*.(gif|jpg|jpeg|png)$ {进程数的优化:如果服务器性能比较好可以设置大一些提高Nginx的效率。worker_processes 8超时时间:设置超时时间,默认的是60s,Nginx会自动踢出超时的连接,保持可用性。keepalive_timeout 90;Tomcat调优和配置最大的线程数 maxThreads:Tomcat使用线程来处理接
2021-10-06 01:35:11 355
原创 ThreadLocal使用和原理(完结)
这里写目录标题一 是什么二 实际使用和使用场景2.1 Helloworld:2.2 工作中实际应用2.3 框架中的应用2.3.1 Spring的数据库连接一 是什么作者的描述:This class provides thread-local variables. These variables differfrom their normal counterparts in that each thread that accesses one(via its {@code get} or {@
2021-07-11 23:31:34 282
原创 JVM 运行时内存
Java 堆从 GC 的角度可以细分为: 新生代和老年代。新生代 是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象,所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、ServivorTo 三个区。MinorGC 采用复制算法:eden、servicorFrom 复制到 ServicorTo,年龄+1,默认15次就放到老年代。内存比较大的对象也会直接放到老年代。老年代主要存放应用程序中生命周期长的内存对象。老年代的对象比较稳定,
2021-06-06 01:01:51 138 1
原创 虚拟机怎么判断对象是否需要回收?
虚拟机怎么判断这个对象是否需要回收?Java虚拟机采用的是可达性分析算法这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索。搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,即可被回收。在Java语言中,可作为GC Roots的对象包括:虚拟机栈(栈帧中的本地变量表)中引用的对象。方法区中类静态属性引用的对象。方法区中常量引用的对象。本地方法栈中Native
2021-06-06 00:53:39 123
原创 hashmap扩容为何为何是2的n次幂
hashmap 的内存结构是数组加链表为了使值均匀的分布在数组里,尽可能减少碰撞,增加查询的效率,减少空间的浪费。可以使用key的hashcode去查找,因为hash的时间复杂度是1,速度比较快。然后hash值取模 % 数组的长度 -1。但是与运算& 比取模%速率要快些。所以Java官方使用了与运算&。运算&的特点是11为1,10 或者00为0。这里有个比较巧妙的地方就是:2的n次幂转换为2进制最后一位都是08 1000 16 10000因为key的hash值是跟
2021-06-06 00:44:15 903
原创 线程状态与互相转换
线程状态6个状态定义: java.lang.Thread. StateNew:尚未启动的线程的线程状态。Runnable:可运行线程的线程状态,等待CPU调度。Blocked:线程阻塞等待监视器锁定的线程状态。处于synchronized同步代码块或方法中被阻塞。Waiting:等待线程的线程状态。下列不带超时的方式:0bject.wait、Thread.join、 LockSupport.parkTimed Waiting:具有指定等待时间的等待线程的线程状态。下列带 超时的方式:Th
2020-06-21 23:22:09 121
原创 23种设计模式学习记录之策略模式
本文所有案例代码码云:https://gitee.com/helloworld6379/designPatternGithub:Github地址设计模式概述1 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。2 设计模式的本质提高 软件的维护性,通用性和扩展性,并降低软件的复杂度。3 设计模式并不局限于
2020-06-20 01:11:58 153
原创 23种设计模式学习记录之观察者模式
想说的话:在大学的时候曾经学过这23种设计模式,但是那时没啥编程经验,糊里糊涂过了一遍,没多久就忘记了,工作之后将精力主要集中在学习新技术上,比如springboot,cloud,docker,vue。毕业两年后去面试,发现设计模式还是java程序员需要迈过的一道坎,面试的时候问到代理模式和适配器模式有什么区别,你在工作中用到了什么设计模式,怎么用的?答不上来的特别尴尬,所以决定重新学习这几种设计模式,争取在工作中使用上。本文所有案例代码码云:https://gitee.com/helloworld6
2020-06-12 00:30:04 180
原创 23种设计模式学习记录之模板方法模式
想说的话:在大学的时候曾经学过这23种设计模式,但是那时没啥编程经验,糊里糊涂过了一遍,没多久就忘记了,工作之后将精力主要集中在学习新技术上,比如springboot,cloud,docker,vue。毕业两年后去面试,发现设计模式还是java程序员需要迈过的一道坎,面试的时候问到代理模式和适配器模式有什么区别,你在工作中用到了什么设计模式,怎么用的?答不上来的特别尴尬,所以决定重新学习这几种设计模式,争取在工作中使用上。本文所有案例代码码云:https://gitee.com/helloworld6
2020-06-07 16:18:31 150
原创 23种设计模式学习记录之单例设计模式
想说的话:在大学的时候曾经学过这23种设计模式,但是那时没啥编程经验,糊里糊涂过了一遍,没多久就忘记了,工作之后将精力主要集中在学习新技术上,比如springboot,cloud,docker,vue。毕业两年后去面试,发现设计模式还是java程序员需要迈过的一道坎,面试的时候问到代理模式和适配器模式有什么区别,你在工作中用到了什么设计模式,怎么用的?答不上来的特别尴尬,所以决定重新学习这几种设计模式,争取在工作中使用上。设计模式概述1 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验
2020-05-21 23:34:25 213
原创 Docker使用
一 简介1.1Docker的由来一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根...
2020-05-06 01:12:55 551
原创 springboot源码解析:启动过程
springboot的入口程序@SpringBootApplicationpublic class StartupApplication { public static void main(String[] args) { SpringApplication.run(StartupApplication.class, args); }}当程序开始执行之后,会调用SpringApplication的构造方法,进行某些初始参数的设置//创建一个新的实例,这个应用程序
2021-10-10 22:51:44 173
原创 redis穿透,击穿和雪崩的原因和解决方案
穿透:没有这个值,一直获取,缓存中设为空字符串返回。击穿:一个数据没有,大量请求去查询数据库,压力大。用锁,一个线程去读数据库。雪崩:同一时间大量对象失效,设置过期时间随机,热点数据永不过期。...
2021-10-06 01:08:04 68
原创 拦截器Filter、过滤器HandlerInterceptor和监听器 Listener区别
Spring的拦截器与Servlet的Filter 有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:1、使用范围不同: Filter 是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing 程序中。2、规范不同: Filter是在Servlet 规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。3、使用的资源不同: 同其他的代码块一样, 拦截器
2021-10-06 00:06:15 221
原创 JVM常用参数
-Xms 初始堆大小-Xmx 最大堆大小 -Xmn 年轻代大小-XX:NewSize 设置年轻代大小 -XX:MaxNewSize 年轻代最大值-XX:PermSize 设置持久代-XX:MaxPermSize 设置持久代最大值-XX:NewRatio 年轻代(包
2021-10-05 00:37:00 84
原创 idea快捷键
复制上一行 ctrl + d剪切当前行 ctrl + x删除当前行 Ctrl + Ymain方法 psvm格式化代码:全选中 Ctrl + Alt + L可选中光标所在的单词或段落 Ctrl + W 显示最近打开的文件记录列表 Ctrl + ECtrl + N 根据输入的 类名 查找类文件Ctrl + Alt + O 优化导入的类,可以对当前文件和整个包目录使用 (必备)Ctrl + Shift + / 代码块注释 (必备)Ctrl + Shift + Enter 自动结束
2021-07-07 22:50:26 107 2
转载 ReentrantLock和AQS原理
观摩大佬七八年前的文章:https://blog.csdn.net/luonanqin/article/details/41871909也不知道大佬现在咋样了。ReentrantLock类图:AbstractOwnableSynchronizer类保持和获取独占线程。AbstractQueuedSynchronizer是以虚拟队列的方式管理线程的锁获取与锁释放,以及各种情况下的线程中断。提供了默认的同步实现,但是获取锁和释放锁的实现定义为抽象方法,由子类实现。目的是使开发人员可以自由定义获取锁以
2021-07-04 18:28:13 124
转载 JMM内存模型、计算机内存模型、CPU缓存一致性原则(MESI)、volatile、指令重排和内存屏障(Memory Barrier)
转自知乎 作者:祥先生链接:https://www.zhihu.com/question/296949412/answer/864851230一、JMM概念java内存模型,英文全称为java memory model,简称JMM。查询维基百科和oracle官网对JMM(java内存模型)的定义:维基百科原文:The Java memory model describes how threads in the Javaprogramming language interact through m
2021-07-03 00:03:49 520
转载 Java对象结构与synchronized实现原理及MarkWord详解
本博客的本意不是技术分享只是在学习过程中感觉需要复习的知识点记录整理下来方便复习,以便面试的时候用具体细节请阅读《深入理解Java虚拟机》若本文对你有帮助那十分荣幸。JAVA对象的总体结构由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能 。在学习并发编程知识synchronized时,我们总是难以理解其实现原理,因为偏向锁、轻量级锁、重量级锁都涉及到对象头,所以了解java对象头是我们深入了解synchronize
2021-07-01 23:57:39 654
原创 多线程面试相关技术点
1、线程启动run和start 的区别run 只是执行了一个方法start 开启了一个线程2、线程状态和之间的转换1 new 被创建出来 还没调用start2 runnable 调用start方法之后,被线程调度器执行,也就是操作系统执行。整个状态叫runnable,runnable 内部有两个状态,一个叫ready就绪,在CPU的等待队列,一个叫running。挂起就是线程执行时间片到了,CPU需要执行下一个线程了3 timedwaiting4 waiting5 blocked 阻
2021-06-29 00:10:30 238
原创 虚拟机内存模型
虚拟机内存模型主要包含线程共享和线程独享部分。方法区和堆内存是线程共享,虚拟机栈、本地方法栈和程序计数器是线程独占部分。方法区/永久代:JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据。虚拟机规范中这是一个逻辑区划。具体实现根据不同虚拟机来实现。如: oracle的HotSpot在JDK7中方法区放在永久代,JDK8放在元数据空间。堆内存:堆内存还可以细分为:新生代(Eden、 From Survivor、To Survivor)和老年代JVM启动时创建,存放对象的实例。垃圾.
2021-06-06 00:58:14 406
原创 windows安装解压版mysql
windows安装解压版mysql解压后放到安装目录:配置环境变量创建data目录,存放数据配置文件解压后放到安装目录:配置环境变量path 下加C:\DevProFiles\mysql-8.0.23-winx64\bin;创建data目录,存放数据配置文件写到这步去官网看了看,官网给出了安装包的下载地址https://dev.mysql.com/doc/refman/8.0/en/windows-installation.html那就下载执行吧https://dev.mysql.
2021-03-21 21:25:24 89
原创 centos7与centos6命令差异
查看ipcentos6 : ifconfigcentos7 : ip addr修改hostnamecentos6 : 修改/etc/sysconfig/networkcentos7 : 修改/etc/hostname,也可以直接使用命令 hostnamectl set-hostname yourhostname修改ipcentos6: vim /etc/sysconfig/network-scripts/ifcfg-eth0centos7: vim /etc/sysconfig/net
2020-06-27 15:12:49 395
原创 JAVA程序运行原理分析
Class文件内容java源码编译完成后会生成class字节码文件。class文件包含JAVA程序执行的字节码;数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符;文件开头有一个0xcafebabe(16进制)特殊的一个标志。JVM运行时数据区方法区JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据。虚拟机规范中这是一个逻辑区划。具体实现根据不同虚拟机来实现。如: oracle的HotSpot在java7中方法区放在永久代,java8放在元数据空间,并且通过
2020-06-21 19:23:19 176
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人