自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 数据库连接

1.通过Driver对象加载驱动2.获取连接对象Connection3.通过连接对象获取执行者Statement或者PrepareStatement4.执行完成后获取Result对象5.关闭连接。

2024-03-10 11:01:58 188

原创 ThreadLocal

5.因为上述的原因,在ThreadLocal这个类的get()、set()、remove()方法,均有实现回收 key 为 null 的 Entry 的 value所占的内存。所以,为了防止内存泄露(没法访问到的内存),在不会再用ThreadLocal的线程任务末尾,调用一次 上述三个方法的其中一个即可,一般使用remove。4.ThreadLocalmap的key是弱引用,也就是说弱引用在没有被其他强引用所引用,gc就会回收。所以key为null的entry的value就一直占据内存,造成内存泄露。

2024-03-09 17:18:56 335

原创 thread常用方法汇总

该方法与sleep()方法类似,都是可以让当前正在运行的线程暂停,区别在于yieId()方法不会阻塞该线程,它只是将线程转换为就绪状态,让系统调度器重新调度一次,并且yieId()方法只能让优先级相同或者更高的线程有执行的机会。也就是说多条线程竞争的有两样东西时间片和同步资源锁(也许还有别的,才疏学浅,暂时就想到这两个),也许某条线程抢到了时间片,但是他执行发现没有同步锁,也是没办法去顺利执行业务代码的,对吧?sleep方法是让线程休眠进入阻塞状态,调用需要传入休眠是时间,单位是nanos毫秒。

2024-03-06 10:51:15 317

原创 23种设计模式——原型模式

原型模式也称为克隆模式,也就是将已经创建好的对象作为原型,通过复制原型对象创建出相同或相似的对象。

2023-09-18 16:28:10 73

原创 集合总结笔书

还有一个非常有意思的知识点、elementData是被transient修饰的,可是arrayList明明支持序列化啊,原来是通过readObject和writeObject方法来进行序列化的,不直接通过elementData序列化应该是为了节省空间。实现了list、Deque、Cloneable、Serializable接口,是一个双端队列(链表),不支持随机访问、内存空间不连续,因此增删快,遍历慢。2的n次幂减1就能保证最低位永远是1,0&1=0,1&1=1,这样就能保证了元素相对均匀分布。

2023-07-24 10:00:21 64

原创 数据结构理解总结

快就是慢,慢就是快。勉励自己不要急于求成,享受人生,享受过程。

2023-07-23 21:25:53 72

原创 logstash

logstash可以动态的采集、转化、输出数据。不受格式和复杂度的影响。

2023-07-07 10:49:14 79

原创 23种设计模式——外观模式

springcloud中的WebMvcConfigurer接口,实现该接口可以自定义拦截器、消息转换器、javabean等等。springcloud为我们提供了统一的外观(门面)使的开发者可以忽略复杂的使用。springcloud中的网关组件:所有客户端并不直接访问复杂的springcloud系统,而是统一入口访问网关,网关去访问子系统。

2023-07-01 16:39:42 57

原创 阻塞队列概述

使用以下构造方法可以创建公平性访问的 SynchronousQueue,如果设置为 true,则等待的线程会采用 先进先出的顺序访问队列。延时阻塞队列,入队元素必须实现Delayed接口,接口的作用是指定一个时间,只有超过这个时间,该元素才可以出队。由数组构成的有界阻塞队列,必须要设置队列长度,默认情况下为非公平(即不保证访问线程的先后顺序,即非公平锁)。此队列用了两把锁,即生产者一把锁,消费者一把锁。优先队列,由数组实现(二叉堆),初始容量为11,可以自定义比较器,每次出队的都是优先级最高的元素。

2023-06-12 18:12:34 62

原创 Condition用法

Condtion是java 1.5中才出现的,它出现的目的是替代Object类中的wait()、notify()方法来实现线程间的协作,Condition的await()、signal()方法颗粒度更加细(可以创建多个等待队列),更加安全高效。5.当调用到某个condtion队列的signal方法时,会把condtion队列的首节点移动到aqs队列中,这样就具备了获取锁的权利,而不是一直等待。4.要想进入condtion队列,必须先要获取到锁,否则是进不去的,只能在aqs队列里等着。

2023-06-09 17:37:17 101

原创 23种设计模式——观察者模式

观察者模式其实就是我们常讲的监听者模式,其实也是一种发布/订阅模式。

2023-06-06 17:16:53 43

原创 volatile关键字讲解

volatile关键字主要有两个作用1.保证变量的内存可见性2.禁止指令重排(内存栅栏)1.讲到内存可见性就要必须要讲到java的内存模型JMM(Java Memory Model)JMM 定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本。通俗讲上面话的意思就是实例变量和类变量不仅存在主内存中,每个线程还自己存了一份。如上图线程A修改了某个共享变量的值,线程B读的是自己的本地内存第一时间是不知道的。

2023-06-06 11:41:36 39

原创 23种设计模式——单例模式

即直接创建该单例对象,不存在线程安全问题,spring用的是单例注册表,即一个map对象存储单例对象,是在饿汉式的基础上实现的,也是直接创建对象。(可以了解spring这种思想,以后在设计模块的时候能借鉴)。最好的方式就是双重判断,第一次判断不走锁,然后争抢锁,然后进行第二次判断,这样的性能是比较好的,也解决了线程安全问题。但是存在线程安全问题,需要处理,最简单粗暴的方式是给getInstance方法加锁,但是这样对性能影响大。即在该对象第一次使用的时候再去new对象,这样的好处是可以节省内存空间。

2023-06-05 17:08:20 35

原创 算法——双轴快排(双指针,分治)

如果发现arr[k] < p1,说明arr[k]应该放在left指针的左侧,没有问题吧。所以这个时候我们交换k++的值和++left的值,k++很好理解,以为指针要向前遍历,当前下标处理好了,没有问题。但是为什么要++left呢?如果发现arr[k] > p2,那么,arr[k]就应放在right指针右侧,这时候我们让right指针–,也就是交换–right和k的值,这儿k不能++因为换过去的值还没有经过比较。如果发现arr[k] < p2,直接k++就可以了,因为这个值最终位置就是在两个指针中间。

2023-06-04 11:44:59 171

原创 Java到底是值传递还是引用传递

(大家回忆一下用操作字符串的时候,是不是必须用s = s.substring()这样操作)这里同学们可以想一下为什么String会特殊,这就和string在jvm中的存储形式有关系了。当参数为引用数据类型时,传递到也是值,只不过这个值是对象的引用地址(哈哈,此处我只想说草蛋两个字,但是专业知识就是这么讲解的),所以修改形式参数会影响到实际参数。当参数为基本数据类型时,就会遵循值传递的原则,因此修改形参不会影响到实参。

2023-06-03 11:45:06 127

原创 23种设计模式——代理模式

动态代理一般由两种实现方式,一种是和原对象实现同一个接口(即jdk动态代理),另一种是直接继承原对象(即cglib动态代理asm字节码技术)。另一个好处就是契合了七大原则中的开闭原则。在拓展功能的时候直接动代理对象就可以了,不用动原对象。一个就是客户不需要直接访问/引用原对象,就像我们买房租房都是找中介。

2023-06-03 11:09:54 36

原创 23种设计模式——模板模式

具体的应用体现在Java锁中,我们知道aqs就是定义了整个算法的流程骨架,而保留了一些抽象方法。我们常用的async继承了aqs,实现了这些抽象方法。这就是一个经典的模板模式使用案例。(后续复习到java锁的时候会把具体的应用填补上)。在方法中预先定义好一个算法的骨架,对其通用部分进行实现,保留某些步骤交由子类来实现。这样做的好处就是子类不需要关注具体算法步骤,只要实现特定部分就可以了。

2023-06-02 17:02:20 34

原创 设计模式七大原则

一个类应当只有一个引起它变化的原因,应当只有一个职责。这种原则同样适用于方法,一个方法也应该做好一件事,如果一个方法处理的事情很多代码可读性就比较差(可以看源代码,基本都是把方法拆的特别细)。这样做的好处就是提高了类的可读性,降低了类的负责度,提高了内聚性。

2023-06-02 16:19:14 37

原创 23种设计模式——责任链模式

3.具体处理者(Concrete Handler):实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者,或者直接return。2.抽象处理者(Handler):定义一个处理请求的接口,包含抽象处理方法和一个后继连接(或者责任链对象,因为我得到了责任链就相当于知道了后继处理者对吧)。5.客户类(Client):创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程,只得到最终的结果。用软件设计的语言来讲就是一个对象需要被多个对象去处理。

2023-06-01 12:05:02 40

原创 spring boot启动流程

1.首先确定容器的类型,有servelt、none、reactive是通过反射机制加载核心类确定的。6.修改参数,将程序设置为服务器模式,即没有鼠标键盘显示器正常运行。4.找到main方法所在的类,设置为允许主类,为后面的扫描做准备。9.加载环境变量,包括maven和系统的环境变量。10.打印banner信息,banner.txt。3.通过spi机制加载所有的listener。2.通过spi机制加载所有的初始化器。8.将main方法的参数加载进来。11.创建应用程序上下文。12.实例化异常报告器。

2023-05-12 10:38:00 52

原创 jenkins自动化部署

然后在服务器上还要提前准备好docker-compose一个yml文件,用于将打包好的spring项目构建成一个docker镜像。然后开始配置好maven、giee的参数,比如说gitee的秘钥、仓库地址等等。这些都具备好之后就可以写一个脚本文件了,停止原来的服务,运行新构建好的镜像。然后去安装插件、包括maven构建工具、gitee插件、打包插件等等。首先jenkins也是基于docker部署的(万物容器化啊!安装好jenkins后即可通过http形式去访问管理页面了。至此自动化部署完成。

2023-05-10 21:07:06 100

原创 缓存框架之jetcache

需要配置keyConvertor表示key的类型转换方式,同时标注value的转换类型方式,值进入redis时是java类型,标注valueEncode为java,值从redis中读取时转换成java,标注valueDecode为java。@Cached:系统调用该接口方法时检测到@Cached标签,首先会根据key去调用get方法获取value值,如果存在value值则直接将值返回,如果不存在key,则会执行代码查询结果,并自动调用get方法将返回值存入缓存中。远程缓存(Remote)

2023-05-10 17:39:01 707

原创 nio、netty以及响应式编程

而nio就不一样了,假设有1000个请求过来,根据实际情况,可以分配20或者80个线程来处理。不像之前的阻塞IO那样,非得分配1000个。也就是io多路复用。传统的bio缺点就是用户一个请求,服务端就要开启一条线程,开启的线程多了,服务端也得逐个执行,这就造成了客户端不能及时收到响应。核心的对象有selector,一个selector可以管理多个channel通道,每个channel对应一个buffer。2.数据从内核空间拷贝到用户空间。1.等待内核空间准备好数据。

2023-05-10 16:53:12 114

原创 动态代理、面向切面汇总

1.先说动态代理(先把动态放下,先讲代理,代理也是23种设计模式中的一种代理模式,大家可以从海外代购理解,我想去海外买东西,得坐飞机,排队,付钱,回国,我觉得太麻烦,于是我只负责付钱,坐飞机,排队,回国都由代理类来做,我和代理类实现同一个接口,或者代理类继承我即可!*CGlib是通过生成一个子类 来继承 被代理的类,实现的动态代理,因此cglib不能代理被final修饰的类,是基于asm字节码实现的,也就是直接生成class文件。2.静态代理其实就是程序员手写的代理类,缺点很明显,一个代理只能代理一个类。

2023-05-10 11:43:10 159

原创 mysql索引、隔离级别问题

你暂时要记住 all就是不走索引,index就是索引全扫描,range索引范围扫描,ref联合查询返回唯一数据,eq_ref使用唯一索引扫描所以更快。4.组合索引(指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。const/system : 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询。ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中。eq_ref : 类似ref,区别在于使用的是唯一索引,使用主键的关联查询。

2023-05-09 16:52:21 48

原创 tcp三次握手和四次挥手

2、服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成);4、客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。

2023-05-09 15:59:45 29

原创 redis为什么快

本文讲解redis(redis涉及到的知识还是挺多的,比如部署方式(单机,主从,哨兵,集群),雪崩,击穿,穿透,不隆过滤器,持久化方式rdb、aop等等,这些都学过好多遍了,本文就不赘述了,主要讲讲redis为什么快)如果list中节点很少就可以用,压缩列表就是定好每个节点的长度(偏移量),然后就可以根据开始位置和长度找到每个节点,这种数据结构只适用于节点少,并且节点上保存的数据少的情况。1.首先redis是内存数据库,基于内存的这么什么好说的。c语言中不存储字符串长度,以、0结尾,sds存储长度。

2023-05-09 11:53:03 30

原创 tomcat架构分析

5-8也就是engine、host、context、wrapper构成了责任链模式(责任链我比较熟了、这里大概写一下,责任链就是一个被处理者,多个处理者,比如说请假申请作为被处理者,由多个处理者组长,部门经理,总经理等等逐级处理,每个处理者有权利中断,也就是直接返回),官方说法是pipeline(整条责任链),valve(活塞的意思,相当于每个阀门,也就是责任链上的每个处理者,也就是5-8)。我是这么理解的,需要把做的事情细化到每个对象,因为处理http请求这种底层的事应该很细,所以需要多个对象。

2023-05-09 11:07:46 42

原创 jvm结构和垃圾回收

3.标记-整理法:为了解决以上两种方法的弊端而设计的,这种方法不适用于老年代,而是适用于垃圾较多的情况,标记完成后将存活的对象移动到另一端(不用像复制算法一样占用两倍的空间,那时间自然就慢了啊,和算法一样,空间时间只能取一个),也体现了整理,最后再根据边界将垃圾清除即可。说白了gcroot就是放在,堆,栈,方法区里的这些内容(你这不是扯淡吗,非gcroot也放在堆,栈,方法区啊),不要误会,兄弟,我写这句话就是方便你理解,你好好想想是不是那么一回事。新生代中的s0、s1就是用的这种算法,缺点就是浪费空间。

2023-05-08 17:24:02 40

原创 osi七层协议

本文介绍的是osi七层协议,主要是我个人的一些理解。(telnet和ssh都是操控服务器的命令、要说区别的话、ssh是加密传输,比telnet更安全,ssh基本可以取代telnet)3.网络层传输的是数据包,负责给节点之间简历逻辑链路,负责路由,这一层的设备有路由器。6.表示层主要复杂数据的加密解密、图片,视频的编码,解码,数据的压缩解压等等。2.链路层传输的是帧,在物理层的基础上封装了mac地址。4.传输层传输的是数据段,这一层的协议有tpc/ip、udp。1.物理层传输的是比特流。

2023-05-08 15:22:23 121

原创 springmvc

今天接着昨天的内容,继续研究springmvc的各个组件、当明白了这些组件的作用后,串起来也就搞懂了springmvc。

2022-10-23 20:34:03 69

原创 springmvc(2022/10/22学习记录)

用了这么久的springboot、springmvc其底层原理以及关键的处理类还不是很清晰。之前背过面试题,有dispatcherServlet、handlerMapping、handlerAdapeter、handler、ModelAndView这些关键类,但是真实的执行过程远远不止这些,比如异常处理器、拦截器等等都被省略了。积跬步以至千里,那么让我们以组件(类)为单位,开始刨析springmvc,当我们搞清楚每个类的作用之后,把他们串起来就构成了完整的mvc。

2022-10-22 21:47:03 57

原创 servlet用法概述(2022/10/21学习记录)

前言一、servlet二、总结最近准备学习reactor编程,据说比mvc性能方面又高一个段位。突然发现自己连mvc底层怎么执行的都仅仅是浅尝辄止。。。。基础确实重要啊,真的。所以今天准备先把servlet、springmvc的原理摸一摸。其实servlet技术已经被springmvc可以说是取代了,但是我又从新学习servlet,因为springmvc是servlet发展的产物,鄙人以为要想真正搞懂mvc,servlet首先要搞清楚。不知道我的观点大家会不会苟同。哈哈。

2022-10-21 23:22:13 122

原创 redis缓存击穿、穿透、雪崩及衍生问题(学习记录2022/10/19)

好记性不如烂笔头以前也学懂了挺多“复杂”的知识,但是过段时间再回忆忘得,干干净净。突发奇想开始写学习记录。

2022-10-19 21:40:18 229

原创 微信企业付款到银行卡(微信转账)(Java完整版)

业务介绍微信付款到银行卡,也就是转账。需要将银行卡号、卡主真实姓名按照微信支付制定的加密规则进行加密,(开发完感觉加密比转账复杂,哈哈哈)。加密的秘钥,也就是钥匙,也要通过请求向微信获取,重点是获取到之后,并不能直接使用。还要进行两次处理。(太难了)。最后用处理好的秘钥,对银行卡号、姓名进行加密。发送转账请求就完成了。前置工作证书(apiclient_cert.p12)、商户号(mch_id)、secret。工具类加密用到的工具类(常量PKCS8_PUBLIC需要改成自己的,后面会讲)publi

2021-01-30 09:22:14 3613 2

原创 Web架构中的dao、service、controller详解

引入我相信很多同学和我一样,初学Java-web的时候,对三层架构理解不是很透彻,不明白为什么要这样命名以及每层应该写什么样的代码。今天我就把我的理解分享给大家。daodao全称data access obejct,翻译过来就是数据 通道/访问 对象。在Java的世界中,万物皆用对象来表。所以当我们需要和数据库进行交互的时候,就需要数据访问对象。这些对象就放在这一层。serviceservice顾名思义就是服务层,当我们在通过dao访问数据库前,或者是通过dao拿到数据后,都有可能要对这些数据进行

2020-12-20 10:51:50 2617 1

服务端资源

服务端资源,自创,适合初学者借鉴参考,java编写,通过socket实现。

2018-09-07

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除