- 博客(27)
- 收藏
- 关注
原创 Java之线程池详解
在创建的线程池中,如有100个线程任务,核心数为10,最大线程数为20,队列大小为10,当执行100个任务是,会在第31个线程触发拒绝策略异常,因为最大线程20+队列10=30,执行31个任务就触发了拒绝策略。在创建了线程池后,当有请求任务进来之后,就会安排池中的线程去执行请求任务,近似理解为今日当值线程,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放入缓存队列中。内存溢出问题:因为队列的的大小是int最大值,队列线程太多容易出现内存溢出,因为线程队列任务满了。
2023-05-03 22:25:32
440
原创 服务的熔断与降级详解
它主要有一个断路器,相当于一个保险丝,当服务调失败,没有达到预期的失败率,只会降级处理,如果超过预期的失败率后,直接跳闸,所有请求不能调用,都走降级处理。同时会设置一个重试时间,重试启动后,断路器半启动状态,如果正常调用或失败率低,在全启用,如果失败或失败率高,继续跳闸。就是访问业务方法时,失败后配置一个可以提供成功调用的方法实现降级,这样可以给调用者一个很好的提示,以及不让服务出现卡超时,影响调用其他服务的一种解决策略(超时/异常/宕机都会到服务降级)
2023-05-03 15:12:18
249
原创 Java中HashMap面试详答
6.当调用hashCode方法结合数组长度计算出来的索引如果在数组中存在,再判断hash值是否相等,如果相等,此时发生hash碰撞,然后会调用对象中的equals来判断对象是否相等,如果相等,第二次的的值直接覆盖第一次的value值,如果不相等,会向下与链路比较其他key,如果都不相等,规化出一个节点存储数据,java1.8后,会判断链表大于8并且数组角标大于64启用红黑树,变成红黑树为了高效的查询。java1.8前:链表+数组 , java1.8后:链表+数组+红黑树,数组默认长度是16。
2023-05-03 14:40:13
180
原创 Java的四大引用强、软、弱、虚
引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存,内存不足会自动回收。弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。
2023-05-03 14:18:28
253
原创 WebService服务调用
Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。
2023-04-23 15:45:36
249
原创 MySQL数据库卸载
找到C:\Documents and Settings\All Users\Application Data\MYSQL。有的话全部删除(技巧:用ctrl+F 搜索 循环查找“mysql” 是否残余MySQL);备注:如果卸载不干净,无法再次安装!完成后即可再次安装,不需要重启系统。
2023-04-21 22:03:30
71
原创 处理执行一段代码,超时抛异常或结束执行
执行一段代码超时处理是比较常见的需求,比如在进行一些比较耗时的业务处理或者在占用一些比较宝贵的资源(如数据库连接),我们通常需要给这些操作设置一个超时时间,当执行时长超过设置的阈值的时候,就终止操作并回收资源,给用户一个提示,不用等到资源耗尽。执行下面的代码进行处理。
2023-04-19 12:32:56
431
原创 Java之volatile详解
保证可见性,不保证原子性,禁止指令重排序,在并发情况下,将volatle修饰的值存在每个线程的本地内存中去,如果有更新操作,触发总线嗅探将强制更新内存中值,并将其他线程的副本值失效,其他线程会重新获取副本。
2023-04-11 10:56:14
514
原创 深拷贝和浅拷贝的理解
在 Java 里面,无论是深拷贝还是浅拷贝,都需要通过实现 Cloneable 接口,并实现 clone()方法。然后我们可以在 clone()方法里面实现浅拷贝或者深拷贝的逻辑。实现深拷贝的方法有很多,比如通过序列化的方式实现,也就是把一个对象先序列化一遍,然后再反序列化回来,就会得到一个完整的新对象。在 clone()方法里面重写克隆逻辑,也就是对克隆对象内部的引用变量再进行一次克隆。
2023-04-09 17:10:47
48
原创 finally 块一定会执行吗?
finally 语句块在实际开发中使用得非常多,它是和 try 语句块组合使用通常情况下,不管有没有触发异常,finally 语句块中的代码是必然会执行的所以我们会把资源的释放、或者业务日志的打印放在 finally 语句块里面。所以,当大家把这个理念当成是固定的公式以后,就很少会去思考 finally 语句块什么情况下不执行。
2023-04-09 17:00:43
739
原创 CAS机制理解
CompareAndSwap 是一个 native 方法,实际上它最终还是会面临同样的问题,就是先从内存地址中读取 flag 的值,然后去比较,最后再修改。这个过程不管是在什么层面上实现,都会存在原子性问题。所以CompareAndSwap 的底层实现中,在多核 CPU 环境下,会增加一个Lock 指令对缓存或者总线加锁,从而保证比较并替换这两个指令的原子性。CAS 主要用在并发场景中,比较典型的使用场景有两个。
2023-04-09 16:34:20
52
原创 缓存穿透、缓存雪崩、缓存击穿等详解
缓存实际上就是某个程序利用内存来优化频繁读取的数据的一种方式。缓存就是内存的一部分。数据库操作往往是存储在磁盘中的,但是磁盘IO很慢,怎么办?程序猿们想了一种方法,就是利用好内存。不是磁盘IO慢么,那就利用内存,内存IO很快,但是东西太多,放不进内存怎么办?那就把常用的数据放在内存。不用缓存就是程序与磁盘IO,有了这个方式,大大加快了系统响应的速度,这就是缓存。
2023-04-02 18:00:15
93
原创 Hibernate-invalidator校验
一、参数校验(类属性)在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等。 会导致如下情况:验证代码繁琐方法内代码显得冗长修改相同逻辑验证代码时需要修改涉及到同样逻辑的所有地方hibernate validator(官方文档)提供了一套比较完善、便捷的验证实现方式。spring-boot-starter-web 包里面有hibernate-validator包,不需要再引入依赖。使用@Valid对参数进行校验在使用对象进行参数接收时,我们可以对参数进行校验录
2021-09-02 22:33:55
130
原创 BigDecimal类的使用大全
构造器BigDecimal(int) 创建一个具有参数所指定整数值的对象。BigDecimal(double) 创建一个具有参数所指定双精度值的对象。BigDecimal(long) 创建一个具有参数所指定长整数值的对象。BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。转换值toString() 将BigDecimal对象的数值转换成字符串。doubleValue() 将BigDecimal
2020-12-31 23:36:57
457
原创 Linux源码安装JDK
1:下载xxxx.tar.gz结尾的这个JDK2:复制到 /usr/local目录下cp xxxx.tar.gz /usr/local
2020-12-05 20:10:05
325
原创 Linux安装使用tomcat及注意事项
下载xxxx.tar.gz结尾的这个tomcat,最好放在/usr/local路径下解压xxxx.tar.gztar -zxvf xxxx.tar.gz进入解压后文件的bin目录./startup.sh 启动./shutdown.sh 关闭查看使用是否启动netstat -apn | grep 8080这样就启动成功了强制关闭tomcat(杀死进程)kill -9 进程号(如这里的:6000)修改端口进入conf.
2020-12-05 20:09:21
135
原创 Linux之shell基础编程(二)
一、基础正则表达式1.1 正则表达式与通配符的关系1.2 基础正则表达式符号1.3 基础正则表达式解释先准备一个文件,test_rule.txt 文件二、字符串截取命令2.1 cut字段提取命令cut命令与grep命令相似,cut提取的是列并输出,grep提取的是行并输出grep -i/-v "指定字符串" 文件 提取的是行并输出 -i 不区分大小写 -v
2020-11-24 21:45:36
189
原创 Linux之shell基础编程(一)
一、shell概述查看当前Linux支持的shellvim /etc/shells二、shell脚本的执行方式2.1 echo 输出命令echo [选项] [输出的内容] -e 开启反斜杠控制的字符转换 例: echo -e "ab\bc" 输出: ab echo -e "\e[1;31m ABCD \e[0m" 输出: ABCD(红色) (30->黑 31->红 32->绿 33-
2020-11-16 22:27:41
228
原创 Linux命令大全之常用命令
一、文件处理命令1.1 目录处理命令ls 显示当前目录文件或指定目录文件下文件ls [-ald] [文件路径/目录路径/空] -a 显示所有文件,包含隐藏文件 -l 详细信息显示 -d 查看文件属性备注:显示的文件信息mkdir 创建新目录mkdir [-p] [目录名] (-p可以省略) -p 递归创建目录(连续写2个或2个以上不存在的目录,能同时创
2020-11-02 23:10:02
395
1
原创 简单理解和运用观察者设计模式
观察者设计模式适用场景: 当一个条件成立的时候 我需要 同时通知所有的订阅者1. 定义一个观察者接口public interface Observer { //通知有数据更新的方法 void update(String str);}设计两个地方观察者实现这个观察者接口/** * 北京观察者 */public class BeijingObserver implements Observer { @Override public void updat
2020-10-28 23:36:32
90
原创 简单理解和运用策略设计模式
策略设计模式策略模式: 就是当某一类事物具有某一种行为,而这种行为是不确定的,那么这个时候就可以采用策略的设计模式例如:狗叫的这种行为: 叫的好听 叫的不好听 不会叫动物睡觉这个行为: 鱼睁眼睡 闭眼睡觉 不睡觉人旅游工具的选择这个行为: 走路 骑车 坐公交车 飞机等下面就以人去旅行选择交通工具为例来简单理解策略设计模式1.将要选
2020-10-27 22:47:55
147
原创 简单理解和运用单例模式
单例模式之饿汉式(普通)/** * 饿汉式 */public class Singleton { //创建对象实例 private final static Singleton bean = new Singleton(); /** * 私有化构造方法,不能直接使用new关键字创建对象 */ private Singleton() { } /** * 通过这个方法来直接进行获取本对象的实例 * @retur
2020-10-26 23:26:18
76
原创 Redis的五种类型使用的基本命令
key相关的命令:keys * 查看当前数据库中所有的keyselect 下标(数据库下标) 表示的是切换到某一个数据库(Redis默认是有16个数据库,默认数据存储是存储在0号数据库)del key 删除某一个keyexists key 判断某一个key是否存在当前数据库中expire key 给这个key设置过期时间ttl key
2020-10-22 23:13:58
102
原创 Git常用命令及解决冲突
GIT最常用命令1.进入文件夹,打开Git Bash Here窗口,将远程仓库的代码拉取到本地git clone <远程仓库的地址> ./ 2.常看文件状态(是否添加到本地暂存区)git status 或 git status -s (显示详细信息)3.加入文件或者文件夹到本地缓存区git add 文件(常用git add *.java或 git add *.xml 进行提交)/文件夹4.查看缓存区新增了哪些文件 g
2020-10-21 22:02:40
3555
2
原创 理解和运用JDK动态代理模式
JDK动态代理模式解决问题: 主要业务与次要业务松耦合的组装本质: 监控行为特征下面主要解决: 吃饭前洗手,wc后洗手人的行为接口public interface Behavior { //吃饭 void eat(); //上厕所 void wc();}人实现了该有的行为public class Person implements Behavior { @Override public void eat() {
2020-10-20 23:33:01
71
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人