自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

存在,即合理

记录点点滴滴,最终汇成山河大海

  • 博客(384)
  • 资源 (7)
  • 收藏
  • 关注

原创 tomcat中线程池的配置

实际上任务在执行中,线程不可避免会发生阻塞,比如阻塞在 I/O 等待上,等待数据库或者下游服务的数据返回,虽然通过非阻塞 I/O 模型可以减少线程的等待,但是数据在用户空间和内核空间拷贝过程中,线程还是阻塞的。这是一个迭代的过程,先用上面两个公式大概算出理想的线程数,再反复压测调整,从而达到最优。也就是先设置一个较小的线程数,然后进行压测,当达到系统极限时(错误数增加,或者响应时间大幅增加),再逐步加大线程数,当增加到某个值,再增加线程数也无济于事,甚至 TPS 反而下降,那这个值可以认为是最佳线程数。

2024-12-29 00:38:34 1231

原创 tomcat IO 模型选择

I/O 调优实际上是连接器类型的选择,一般情况下默认都是 NIO,在绝大多数情况下都是够用的,除非你的 Web 应用用到了 TLS 加密传输,而且对性能要求极高,这个时候可以考虑 APR,因为 APR 通过 OpenSSL 来处理 TLS 握手和加 / 解密。OpenSSL 本身用 C 语 言实现,它还对 TLS 通信做了优化,所以性能比 Java 要高。什么时候考虑选择 NIO.2?

2024-12-29 00:16:58 987

原创 多线程-可重入锁(又名递归锁)

程序第2次进入被自己阻塞。

2024-12-26 23:53:01 206

原创 读写锁再优化之 StampedLock

有没有比读写锁更快的锁?StampedLock是JDK1.8中新增的一个读写锁,也是对JDK1.5中的读写锁ReentrantReadWriteLock的优化。邮戳锁:也叫票据锁stamp(戳记,long类型)代表了锁的状态。当stamp返回零时,表示线程获取锁失败。并且,当释放锁或者转换锁的时候,都要传入最初获取的stamp值。StampedLock 不是基于 AQS 实现的,但实现的原理和 AQS 是一样的,都是基于队列和锁状态实现的。与RRW 不一样的是,

2024-12-23 23:31:16 819

原创 多线程AQS

定义了程序员和锁交互的使用层API,隐藏了实现细节,你调用即可。

2024-12-22 23:23:01 606

原创 多线程-锁Lock

Lock.lock():获取锁,如被锁定则等待。Lock.tryLock(long timeout, TimeUnit unit): 获取 锁,如已被锁定,则最多等待timeout时间后返回获 取锁状态。这是因为 synchronized 加解锁是由 JVM 实现的,在执行完 synchronized 块后会自动解锁,所以会按照 synchronized 的嵌套顺序加解锁,不能自行控制。但在高负载、高并发的情况下,Synchronized 同步锁由于竞争激烈会升级到重量级锁,性能则没有 Lock 锁稳定。

2024-12-22 22:18:20 782

原创 多线程-锁-写锁(独占锁)/读锁(共享锁)

一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。

2024-12-22 22:16:01 1196

原创 Synchronized-JIT编译器对锁的优化与从字节码角度分析synchronized实现

Just In Time Compiler,一般翻译为即时编译器。

2024-12-15 23:58:04 591

原创 synchronized-锁升级

synchronized锁升级过程总结:一句话,就是先自旋,不行再阻塞。实际上是把之前的悲观锁(重量级锁)变成在一定条件下使用偏向锁以及使用轻量级(自旋锁CAS)的形式JDK1.6之前synchronized使用的是重量级锁,JDK1.6之后进行了优化,拥有了无锁->偏向锁->轻量级锁->重量级锁的升级过程,而不是无论什么情况都使用重量级锁。锁优点缺点适用场景偏向锁加锁和解锁不需要额外的消耗,和执 行非同步方法相比仅存在纳秒级的差距如果线程间存在锁竞争, 会带来额外的锁撤销的消耗。

2024-12-15 23:47:46 1047

原创 synchronized-性能变化-monitor-管程

java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。

2024-12-15 17:30:35 1007

原创 多线程 锁-synchronized 使用-线程操作资源类 本质互斥

一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一的一个线程去访问这些synchronized方法锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法。对于普通同步方法,锁的是当前实例对象,通常指this,具体的一部部手机,所有的普通同步方法用的都是同一把锁——实例对象本身。同步代码块中的锁对象可以是任意的对象;

2024-12-07 23:59:28 685

原创 分布式ID介绍

传统方案在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品。对数据分库分表后需要有一个唯一ID来标识一条数据或消息。

2024-12-01 11:47:58 750

原创 SpringMvc-文件上传基础 01

【代码】SpringMvc-文件上传基础 01。

2024-11-26 22:15:02 196

原创 Mysql-DQL

查询语句书写顺序:select – from- where- groupby- having- order by-limit查询语句执行顺序:from - where -group by -having - select - order by-limit。

2024-11-25 23:36:58 221

原创 jasypt-spring-boot-starter的使用

Override// 这里只是一个简单的示例,实际应用中应使用更复杂的加密算法@Override// TODO 实现解密逻辑// 这里只是一个简单的示例,实际应用中应使用更复杂的解密算法return s;

2024-11-25 00:06:08 1455

原创 ArrayList 还是LinkedList?

LinkedList 也有添加元素到任意位置的方法,如果我们是将元素添加到任意两个元素的中间位置,添加元素操作只会改变前后元素的前后指针,指针将会指向添加的新元素,所以相比 ArrayList 的添加操作来说,LinkedList 的性能优势明显。当然,两个方法也有不同之处,添加元素到任意位置,会导致在该位置后的所有元素都需要重新排列,而将元素添加到数组的末尾,在没有发生扩容的前提下,是不会有元素复制排序过程的。由于 ArrayList 是基于数组实现的,所以在获取元素的时候是非常快捷的。

2024-11-24 20:44:31 654

原创 线性数据结构02 -链表

最基础的动态数据结构,链表通过指针将一组零散的内存块串联在一起链式存储结构 (对不起,我是警察)

2024-11-24 18:02:32 918

原创 数据结构面试题-数组和链表的区别

如果声明的数组过大,系统 可能没有足够的连续内存空间分配给它,导致“内存不足(out of memory)”。链表本身没有大小的限制,天然地支持动态扩容,我觉得这也是它与 数组最大的区别。而且,对链表进行频繁的插入、删除操作,还会导致频繁的内存申请和释放,容易造成内存碎片,如果是 Java 语言,就有可能会导致频繁的 GC(Garbage Collection,垃圾回收)。数组简单易用,在实现上使用的是连续的内存空间,可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。

2024-11-24 12:43:28 244

原创 线性数据结构01 -数组

线性数据结构是数据元素之间存在一对一关系的数据结构。这类结构中的元素按照一定的顺序排列,每个元素(除了第一个和最后一个)都有一个唯一的前驱和一个唯一的后继。顺序存储结构插队data[2]元素内存地址=1000+2*4=1008所以data[2]=0将index=3的元素的值设置为41.先找到index=3的元素所在的内存地址=1000+3*4=10122.将内存地址为1012指向的内存值设置为4。

2024-11-23 21:20:48 715

原创 序列化-安全

这些类都是平常会使用,但不会序列化的一些工具类,因此我们可以将它们纳入到黑名单中,不允许应用反序列化这些类(在最新的版本中,已经更改为 hashcode 的形式)。可以通过认证,来避免应用接受黑客的异常输入。因此,在调用链中通常会涉及非常规的类,比如,刚才那个 demo 中的 InvokerTransformer。我认为,只要你在反序列化的过程中,避免了所有的接口类(包括类成员中的接口、泛型等),黑客其实就没有办法控制应用反序列化过程中所使用的类,也就没有办法构造出调用链,自然也就无法利用反序列化漏洞了。

2024-11-17 16:14:27 293

原创 正则Java-使用

除此之外,还可以使用 Pattern 配合 Matcher 类进行字符串拆分,这样做的好处是可以对要拆分的字符串进行一些严格的限制。不过,使用 Matcher 来匹配一些简单的字符串时相对比较沉重一些,使用 String 类的。也就意味着,我们拆分字符串有了新的选择,可以不使用 String 类的。使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。替换此字符串匹配给定的正则表达式的第一个子字符串。替换此字符串所有匹配给定的正则表达式的子字符串。根据匹配给定的正则表达式来拆分此字符串。

2024-11-17 00:13:57 745

原创 常见的正则表达式

13012345678 手机号。

2024-11-17 00:05:03 307

原创 正则-量词与贪婪

匹配上一个 y , xy 后,正则会使用 z 和 text 中的 xy 后面的 y 比较,发现正则 z 和 y 不匹配, 这时正则就会向前回溯,重新查看 y 匹配两个的情况,匹配上正则中的 xyy,然后再用 z 去匹配 text 中的 z,匹配成功。y{1,3}会尽可能长地去匹配,当匹配完 xyy 后,由于 y 要尽可能匹配最长,即三个,但字符串中后面是个 z 就会导致匹配不上,这时候正则就会向前回溯,吐出当前字符 z,接着用正则中的z去匹配。匹配剩下的bb,发现匹配不上,输出空 字符串。

2024-11-16 23:57:08 664

原创 正则的基础

1.校验数据有效性2.查找符合要求的文本内容3.对本进行切割,替换。

2024-11-16 23:46:17 888

原创 选择哈希算法应该考虑哪些因素

因为,遗留的算法,已经走在退役的路上了。那为什么有的人还在保留遗留的算法?因为,保留遗留算法,还是会让系统有更好的兼容性和互操作性,给现有系统升级到新算法留有一段时间。但是,新的代码和项目,就不要再使用遗留算法了。现在,还要继续运营的系统,也要想办法尽快升级算法。到了最后,

2024-11-16 23:33:18 897

原创 设置合适的安全强度

安全强度通常使用“位”(字节位)来表述。比如说,安全强度是 32 位。这里的“位”是什么意思?N 位的安全强度表示破解一个算法需要 2^N(2 的 N 次方) 次的运算。“位”用于比较不同算法的安全级别,比如说,MD5 的安全强度是不大 于 18 位,1024 位的 RSA 密钥的安全强度是 80 位, SHA-256 算法的安全强度是 128位。感受一下安全强度。

2024-11-16 22:21:27 475

原创 单向散列函数

散列函数(Hash Function)是一个可以把任意大小的数据,转行成固定长度的数据的函数。比如说,无论输入数据是一个字节,或者一万个字节,输出数据都是 16 个字节。我们把转换后的数据,叫做散列值哈希值。通常的,对于给定的输入数据和散列函数,散列值是确定不变的。散列值碰撞:存在散列值相同的两个或者多个数据,散列值碰撞可不是一件好事情。避免散列值碰撞:输出数据的长度:散列值越长,存在相同散列值的概率就越小,发生碰撞的可能性就越小。计算越困难,散列值的长度选择,应该是权衡性能。

2024-11-16 22:06:58 182

原创 序列化和反序列化的一致性

要解决这个问题,可以开启 Jackson 的 read_unknown_enum_values_using_default_value 反序列化特性,也就是在枚举值未知的时候使用默认值:并为枚举添加一个默认值,使用 @JsonEnumDefaultValue 注解注释:UNKNOWN(-1"未知"

2024-11-16 19:24:39 1150

原创 序列化与反序列化-从规范说起-解读(待)

2)如果不加栈信息,只是 new 自定义异常,加入自己的理解的 error message,对于调用端解决问题的帮助不会太多。在本文 MySQL 规约中的建表约定第一条,表达是与否的变量采用 is_xxx 的命名方式,所以,需要在设置从 is_xxx 到 xxx 的映射关系。Java代码用正则来验证客户端的输入,有些正则写法验证普通用户输入没有问题,但是如果攻击人员使用的是特殊构造的字符串来验证,有可能导致死循环的结果。⚫SQL注入,Shell注入,反序列化注入。

2024-11-14 00:25:41 375

原创 序列化与反序列化-基本了解使用

网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。对象是不能直接在网络中传输的,所以我们需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程我们一般叫做“序列化”。 这时,服务提供方就可以正确地从二进制数据中分割出不同的请求,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象,这个过程我们称之为“反序列化”。序列化就是将对象转换成二进制数据的过程,而反序列就是反过来将二进制转换为对象的过程。RPC通信流程图 目前主流的微服务框架却几乎没有用到 Ja

2024-11-13 23:54:12 1477

原创 java基础-注解

注解就是符合一定格式的语法 @xxxx注解作用:注释:在阅读程序时清楚----给程序员看的 注解:给jvm看的,给机器看的注解在目前而言最主流的应用: 代替配置文件关于配置文件与注解开发的优缺点: 注解优点:开发效率高 成本低注解缺点:耦合性大 并且不利于后期维护。

2024-11-11 23:25:54 522

原创 java基础-泛型

可以接收任意类型的类,相当于普通类的工厂。

2024-11-11 23:19:54 506

原创 IDEA工具使用-启动多个服务,调试

参考上图,在断点的位置,右击断点旁边的小红点,会出来一个界面,在Condition这里填入断点条件即可,这样调试时,就会自动停在i=10的位置。该技巧最适合特别复杂的方法套方法的场景,好不容易跑起来,一不小心手一抖,断点过去了,想回过头看看刚才的变量值,如果不知道该技巧,只能再跑一遍。如果想让线程在调试时,想按自己的愿意来,让它停在哪个线程就停在哪个线程,可以在图中3个断点的小红点上右击,前提是本机有项目的源代码 ,在需要的地方打个断点,然后访问一个远程的url试试,断点就会停下来。

2024-11-10 16:03:53 1378

原创 docker-网络

docker 默认的bridge 不支持ping 容器名容器间 可以直接使用容器名 通信docker run -d -P --network 自定义网络名(提前创建)跨网络连接别人就用。把tomcat加入到mynet网络。

2024-11-09 23:10:44 399

原创 docker-mount

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷/var/lib/docker/volumes(卷的根目录)

2024-11-09 23:04:37 398

原创 docker-容器

容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正在运行的进程。unless-stopped 在容器已经stop掉或Docker stoped/restarted的时候才重启容器。always 在容器已经stop掉或Docker stoped/restarted的时候才重启容器。on-failure 容器发生error而退出(容器退出状态不为0)重启容器。-l :移除容器间的网络连接,而非容器本身。

2024-11-09 22:55:57 857

原创 docker 镜像存储

Docker映像由一系列层组成。每层代表图像的Dockerfile中的一条指令。除最后一层外的每一层都是只读的。

2024-11-09 22:50:29 377

原创 MongoDB-jpa入门简单使用

【代码】MongoDB-jpa入门简单使用。

2024-11-05 23:13:06 387

原创 SQL面试:一条SQL查询语句是如何执行的?

但是全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。这就意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改, 也不会影响已经存在连接的权限。

2024-11-03 23:51:19 906

原创 linux 文件加压缩,搜素

c 产生.tar打包文件-v 显示详细信息-f 指定压缩后的文件名-z 打包同时压缩-x 解包.tar文件。

2024-11-03 19:06:08 435

微服务治理目录111111111

111111111

2024-09-28

Spring Data JPA

Spring Data JPA

2024-07-27

NOSQL-redis-运维-单机安装

NOSQL-redis-运维-单机安装

2024-07-07

网络学习的积累存在合理

网络学习的积累存在合理

2024-05-19

SpringMvc 执行流程

SpringMvc 执行流程

2023-06-18

009 maven插件spring-boot-maven-plugin

009 maven插件spring-boot-maven-plugin

2023-06-17

001线程状态图示原图

001线程状态图示原图

2023-06-10

java8的新特性.doc

自己整理的java8新特性及demo 1. Lambda表达式 1 2. 方法的引用 6 3. 构造器引用 7 4. 函数式(Functional)接口 7 5. 四大函数式接口 8 6. Stream 11 7. Map接口的新方法: 19 8. 并行流与串行流 20 9. Optional容器类 23 10. 接口中默认的方法和静态方法 26 11. 日期 26

2020-01-09

easyUI全部手册

jQuery EasyUI 1.5 版 API 中文版.exe jqueryeasyui-demo.chm EasyUI-API+1.3.2.chm EasyUI+tutorial.chm

2019-03-02

数据库连接工具

数据库连接工具,可以连接多种数据库 界面美观 免费使用

2019-02-28

thinkingjava中文版

java圣经thinkingjava 值得拥有 中文高清版

2019-02-28

postmanwin64

postman接口测试工具 window64 位,测试resful 接口的的

2019-02-28

mysql安装图解 安装版

mysql安装图解版 .msi版,window版你值得拥有

2019-02-28

mysql调优与性能设计

mysql性能调优,架构设计 300多页 高清版.值得拥有啊啊

2019-02-28

空空如也

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

TA关注的人

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