- 博客(75)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 java线程池使用
将线程事先创建好,交给线程池管理,当有任务时,分配线程池中的线程执行任务。返回任务队列中的线程,开发者自行处理没有执行的任务。这些任务只能是实现callable接口的有返回值的任务。invokeany()方法,一旦有任务直接完,其他任务都不执行了,返回最先完成任务的返回值。(1)get()方法:阻塞方法,获取任务执行结果的线程会一直等到任务执行完毕。可能的异常:任务被取消、任务抛出异常、执行任务的线程中断、等待任务执行超时。stop:线程池准备关闭,不接受新任务,终止池中任务,不处理任务队列的任务。
2024-07-15 11:00:13
1512
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 JVM之垃圾回收机制
方法区和永久代以及元空间的关系很像 Java 中接口和类的关系,类实现了接口,这里的类就可以看作是永久代和元空间,接口可以看作是方法区,也就是说永久代以及元空间是 HotSpot 虚拟机对虚拟机规范中方法区的两种实现方式。并且,永久代是 JDK 1.8 之前的方法区实现,JDK 1.8 及以后方法区的实现变成了元空间永久代中存启动类依赖的java类,不存在垃圾回收,关闭jvm才会回收内存。
2024-04-18 21:06:38
845
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Git安装+认识+简单使用
每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。是本地库的根目录中的一个隐藏目录.git,用于记录版本信息,Git进行版本控制所需要的文件,则都放在.git文件夹中;暂存信息存放在.git目录"下的index文件(.git/index)中,用于临时保存内容的修改;.git的目录是Git来跟踪管理版本的不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。相当于将原来的代码锁定,创建一个副本编辑,如果确定修改就把副本合并到原来的,保存修改。
2024-01-23 00:10:26
1365
1
原创 rabbitmq学习记录
(1)同步(按照流程一步一步做)使用openfengin传统的交互(2)异步(微服务A无需等待微服务B,之间返回,微服务B可以等他空闲的时候来消费)削峰填谷:把高峰期的任务转移到低谷期执行。rabbitmq有可靠的消息确认机制,并且吞吐量还行10w左右。
2024-08-08 17:28:08
968
原创 使用exsyexcel导入导出
(3)自己写监听器继承AnalysisEventListener,重写下面的方法。(2)创建实体类映射表中的数据:默认有表头。:可以一行一行读取 excel 内容。(3)调用easyexcel导出数据。(1)将要导出的数据封装成list。: 读取完成之后做什么事情。(2)设置响应头和编码形式。
2024-08-01 16:29:23
503
原创 多种方式防止表单重复提交
这里推荐一个Apache的开源库Curator,它是一个ZooKeeper客户端,Curator提供的InterProcessMutex是分布式锁的实现,acquire方法用于获取锁,release方法用于释放锁。获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁;线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。当执行某个方法时,将方法名和线程插入,插入前先查询是不是存在,存在就返回错误。
2024-07-31 20:26:37
998
原创 说说你对redis的理解2
redis中的数据备份在多个服务器中,为了保障数据一致性,提供了主从复制的策略。主服务器进行读写操作,从服务器只读,并且接收主服务器的同步过来的写操作。设置主服务器和从服务器。
2024-07-28 16:09:26
1073
原创 说说你对redis的理解
String:缓存对象、常规计数、分布式锁、共享session信息hash:(包含键值对的无序散列表)list:消息队列zset:(格式key、value、score根据score进行排序)排名,排序第一层有五个节点、第二层有三个节点、第三层有1个节点比如当查找4节点时,先跳到3节点,然后再跳到4节点。时间复杂度O(logn)
2024-07-27 21:19:48
777
原创 Mysql索引解析
B+树:所有的数据放在叶子结点,中间的非叶子结点是冗余的索引元素。三层的索引B+树,可以存放三千万条数据(每条数据按照1KB算,索引按bingint类型计算、索引按6字节计算)。非聚集索引:索引和数据存储在不同的地方,例如:MyISAM存储引擎将索引存在MYI文件,将数据存在MYD文件中。为所有的数据页生成一个索引页,索引页中存放每页最小的索引。前缀索引是指对字符类型字段的前几个字符建立的索引,而不是在整个字段上建立的索引。根据索引页—>数据页---->数据页目录---->所在分组----->定位数据。
2024-07-26 21:25:15
1041
原创 设计模式笔记
*相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。使用该工厂,通过传递类型信息来获取实体类的对象。创建一个工厂,生成基于给定信息的实体类的对象。
2024-07-24 17:07:16
919
原创 java中常见的锁
非公平锁:多个线程获取资源时,不是按照先来先得的顺序获取锁的。这样性能更好,插队(运行状态的线程获取锁)。等待队列线程获取锁(阻塞的线程先就绪再运行,才能获取锁)。注意申请了几把锁,就要释放几把锁。公平锁思想:多线程按照申请锁的顺序获取锁,当请求获取锁时判断等待队列是不是空,是空获取锁,不是空就加在等待队列末尾排队获取锁。读写锁:ReadWriteLock 控制锁的粒度,分成了读锁和写锁,读锁和写锁之间互斥,读锁和读锁不互斥。偏向锁:锁偏向第一个获取他的线程A,当没有锁竞争时,A线程无需CAS就能获取锁。
2024-07-23 21:08:23
945
原创 java并发编程的艺术1
*轻量级锁加锁:**在线程栈创建锁空间,复制堆中对象Markword的数据,到锁空间中。如果线程还活着,就遍历栈帧和对象,锁记录偏向其他线程或者恢复成无锁状态、或者标记对象不适合使用偏向锁(锁升级)。**偏向锁加锁:**访问同步代码块并且获取锁的时候,就在对象头和栈帧的锁记录里面存储偏向的线程id。锁总线或者锁缓存,一般锁缓存。然后修改,在写回之前,先对比缓存区的和内存中的数据一样吗,一样再写回。避免死锁:避免一个线程同时获得多个锁、避免一个锁同时获得多个资源、定时锁、加锁和解锁必须在一个数据库连接中。
2024-07-16 19:33:31
972
原创 Java 并发基础常见面试题总结
进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。
2024-07-15 21:23:34
1055
原创 JVM面试热点1
(只利用一半空间,如果存活对象比较多,来回复制开销大)。如果是直接引用,好几个对象都引用了堆中的实例,reference都需要修改。标记整理算法:针对如果存活的对象很多,标记复制效率很低。每个线程都有一个线程私有的分配缓存区,就是一块小空间,先让这个线程用着。指针碰撞:在用过的位置末尾之后移动一个空间,给新对象。分代算法:将对象分代存放,按照各自不同的特点选择合适的回收算法。(2)用上面的那个方法,垃圾收集器,是否带有垃圾整理的功能。相互引用的对象,如果新生代也一直没被回收,也放到老年代。
2024-07-13 17:02:53
1097
原创 函数式接口、匿名内部类、lambda表达式
FunctionalInterface注解标记,在idea中可以用这个注解验证是不是函数式接口。实现函数式接口可以转成lambda表达式。匿名内部类的格式:父类/接口 对象 = new 父类/接口(){ 重写父类/接口中的方法 };只有一个抽象方法的接口叫函数式接口,不能有两个,也不能有方法实现。继承了java.lang下的Thread,重写了Thread方法。1.代替实现函数式接口(idea可以自动转换)简化代码,常用的lambda表达式简写方式。
2024-07-11 11:48:22
721
原创 Aop实现后端数据重复提交
用户每次发送请求都有一个标记,这个标记设置成5s有效存到redis中。每次请求检查该标记是否有效,还有效就说明请求太频繁了。无效就说明请求之间时间间隔够了,可以继续请求了。
2024-07-10 16:53:25
560
原创 java代理简单理解
举例说明:当我想买一台电脑,国内太贵了。委托好友A在国外帮忙买。这个情节中我要实现的动作和好友实现的动作一样,都是买电脑。好友帮我完成了这个动作,这就是代理。类A和类B都实现一个interface接口C,C规定了A和B要完成的动作。借助B类实现A类完成接口中的动作。1.使用代理的场景?(1)功能增强:B完成接口中的动作之余还做了别的事情(2)控制访问:B不让A访问到目标类,只有通过B这个媒介,A才能访问。
2024-07-09 20:18:35
326
原创 elasticsearch安装 只能本地访问!!network.host: 0.0.0.0无效(解决)
但是已经配置上了还是不行,用了别人的配置文件还是不行。重装n次之后,重启电脑。查询网上的资料是elasticsearch.yml配置上。解决:最终完整的elasticsearch.yml配置。一样的配置文件不同的电脑就是起不来(难受)云服务器安装了一下午,只能本地访问。一开始没加下面这两行。
2024-06-16 20:02:01
247
原创 Servlet
/域对象都会有的方法,getattribute setattribute removeattribute application.setAttribute("key","value");defalutservlet是处理静态资源,装进response对象中,根据后缀设置content-type。注解配置Filter @WebFilter("/*")注解,注解配置过滤器链中,类名决定过滤器链顺序。目标资源可以是另一个servlet的动态资源,也可以是html静态资源,也可以是受保护资源。
2024-05-16 17:35:42
905
原创 java02
原来是将内存的数据直接写到硬盘中,多次系统调用,性能不好,现在在内存中增加了缓冲池,8KB,缓存池满了再和硬盘交互,减少系统调用,性能更好。如果目标文件过大,同样也会报错。例如 父类:Class Parent<T>{},子类:class Child<T,K> extends Parent<T>{}exists()判断文件是否存在 isFile()是不是文件对象,isDirectory()是不是文件夹。mkdir()创建文件,只能创建一级文件 mkdirs()创建文件夹 delete()删除文件。
2024-05-14 17:25:08
719
原创 redis
redis单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。这也是Redis对外提供键值存储服务的主要流程。
2024-05-11 21:48:33
939
原创 redis分片java实践、redis哨兵机制实现、redis集群搭建
记录redis在用java代码实现分片,redis哨兵机制搭建,redis集群搭建。
2024-05-07 16:24:01
1162
1
原创 docker
docker是一个应用容器引擎,基于 Go 语言,将应用程序装箱打包成独立的容器,确保应用程序在不同的环境下都能运行。Docker的主要目标是‘build ,ship and run any app,anywhere’,也就是说通过对应用程序组件的封装,分发,部署,运行等生命周期的管理。容器之间不会有交互接口,并且开销极低。镜像:类似于安装包,有运行的文件和配置信息文件。容器:镜像运行的实例仓库:存放镜像的地方容器和虚拟机的区别:虚拟机:虚拟硬件。在虚拟机上我们安装操作系统linux镜像。
2024-04-29 15:28:25
1343
2
原创 网盘登录业务记录
本项目中利用文件流写回验证码图片。工具类核心:利用jdk内部的BufferedImage类:这个类生成一个图片存到内存缓冲区,方便我们对图片进行操作。controller层:解释:每次访问页面显示的验证码都要刷新,下面的代码是在服务端禁用jsp缓存。Cache-Control头域用来指定请求和响应遵循的缓存机制。设置返回值类型:字节流前端接收 字节流对象。业务中有好几处需要用到验证码:1.为什么要将这验证码分成两类存储,(session中对应不同的key)???注册业务需要同时用到两处的验证码。
2024-04-28 11:07:53
594
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人