- 博客(353)
- 资源 (27)
- 收藏
- 关注
原创 Groovy编程语法1
Groovy 是运行在 JVM 上的动态脚本语言,语法简洁如 Python,与 Java 100% 互调,主要用来写 Jenkins/Gradle 脚本、快速自动化和构建 DSL。
2025-11-23 14:18:19
166
原创 Pipeline核心语法3
triggers → 自动拉我起来跑input → 人工点“继续”才放行when → 条件不符直接跳过parallel → 一起跑,省时间。
2025-11-20 23:16:42
263
原创 Pipeline核心语法2
交互式表单”,运行前让用户填/选;点击“Build with Parameters”后,Jenkins 把值注入变量,全流水线 ${params.xxx} 读取。给整条流水线或单个 stage 设置“环境变量”,K-V 写法,后续步骤直接 ${VAR} 引用;支持凭据型变量(自动解密)。“流水线级别的开关面板”,一次声明、全局生效,控制并发、超时、重试、日志、构建保留策略等 30+ 细项。
2025-11-20 23:02:20
293
原创 Pipeline核心语法
pipeline{ ← 户口本├── agent{ } ← 在哪跑├── stages{ } ← 跑什么(多幕戏)└── post{ } ← 跑完干嘛。
2025-11-20 20:22:18
261
原创 Jenkinsfile是什么
CI 触发时,Jenkins 会先把源码(含 Jenkinsfile)拉下来,再按 Jenkinsfile 里的指令一步步执行——这就是 “Pipeline as Code” 的核心载体。Jenkinsfile 本质上就是一个纯文本文件,文件名严格区分大小写:Jenkinsfile(没有扩展名)。你把“点鼠标”的那些步骤,按顺序写进一个名叫 Jenkinsfile 的纯文本文件,扔在代码仓库里。你每天在 Jenkins 网页里“点鼠标”——拉代码、点构建、点测试、点部署,累到手抽筋。
2025-11-18 22:08:56
330
1
原创 Jenkins PIpeline是什么
在 Jenkins 里,Pipeline 就是“把原本在 Web 页面上点来点去的构建步骤,用代码的方式一次性写进一个文件里”,然后 Jenkins 按这个文件从头到尾自动执行。这个文件通常叫 Jenkinsfile,放在你的源码仓库,和代码一起版本管理——“构建即代码”
2025-11-18 20:38:38
208
原创 Jenkins备份管理
④ 把 /backup/thin 映射出来或定期 docker cp 到宿主机,再 rsync 走。还原:新容器装同一插件 → ThinBackup → Restore 选中日期 → 重启容器。③ 浏览器 → 系统管理 → ThinBackup → Settings。Backup directory 填 /backup/thin。Schedule 写 H 2 * * *(每天 2 点)容器内 ThinBackup(官方插件,支持增量)勾选 Backup builds 按需。安装插件 BlueOcean。
2025-11-17 22:50:24
190
原创 Jenkins使用指南1
点按钮 → Freestyle;写代码 → Pipeline;多分支 → Multibranch;统一模板 → Shared Library;事件触发 → Webhook。1、安装Pipeline插件。
2025-11-06 23:19:48
347
原创 mysql中mylsam存储引擎和innodb存储引擎的区别
摘要:本文对比了MySQL中MyISAM和InnoDB两种存储引擎的差异。通过创建两张表(user_myisam和user_innodb)并插入数据,从文件组织、锁机制和崩溃恢复三个方面进行对比分析。结果显示:MyISAM采用表级锁且不支持事务,更新时阻塞全表查询;InnoDB支持行级锁,允许并发读写。文件存储方面,MyISAM生成三个独立文件,而InnoDB使用共享表空间。崩溃测试表明,MyISAM数据易损坏,而InnoDB具备崩溃恢复能力。这些差异直接影响数据库的并发性能和数据安全性。
2025-09-04 21:12:54
390
原创 锁性能基准测试
Java多线程锁性能测试报告摘要:在Java 17环境下,对8种同步机制进行百万次操作测试。结果显示,单线程下同步代码块和专用锁对象性能最优(200M ops/s),多线程下分段锁表现最佳(25M ops/s)。ReentrantLock和StampedLock在高并发时吞吐量下降明显(约55M ops/s vs 5M ops/s)。同步静态方法在100线程时仍保持14.7M ops/s的吞吐量,而同步实例方法为11.9M ops/s。测试表明,不同场景下应选择合适的锁机制:低竞争时同步代码块最优,高并发时
2025-08-12 22:43:09
329
原创 AtomicStampedReference解决方案
本文介绍了使用版本戳(stamp)机制解决并发编程中的ABA问题。通过AtomicStampedReference类,在每次修改时递增版本号,并在CAS操作中同时检查值和版本号。示例代码展示了账户余额的并发修改场景:ABA线程先将余额从100改为50又改回100,而转账线程在不知情的情况下尝试修改。由于版本号已变化(0→2),转账操作失败,有效避免了ABA问题。最终输出显示尽管余额相同(100元),但因版本号变化(2),转账线程的CAS操作被正确拒绝。该机制确保了数据修改的可追溯性和并发安全性。
2025-08-10 22:40:24
288
原创 什么是ABA问题?
ABA问题是CAS操作中因值被多次修改最终恢复原值而引发的并发问题。演示显示账户余额从100→50→100,线程1未能感知中间变化仍执行转账,导致非法操作被掩盖。解决方案是使用AtomicStampedReference添加版本戳来跟踪每次修改,确保数据变化的可观测性。该问题在金融、库存等场景可能造成严重后果。
2025-08-10 21:22:13
336
原创 在 JDK 17 上完整观察 synchronized 锁升级过
摘要:本文通过代码演示了JDK 17中synchronized锁的完整升级过程。程序使用Unsafe类和JOL工具分析对象头信息,展示了从无锁状态(001)到偏向锁(101)、轻量级锁(000),最终到重量级锁(010)的完整升级路径。每个阶段都输出了对象内存地址、Mark Word值和锁状态位,并提供了详细的二进制状态说明。特别处理了不同线程竞争时的锁状态变化,为理解Java锁机制提供了直观的观察方法。
2025-08-10 16:39:07
392
原创 Hashmap为什么要保持两倍扩容
这使得hash & (capacity - 1)等价于取模运算hash % capacity,但速度快10倍以上。当元素数量超过 8 × 0.75 = 6 时触发扩容(当前6个元素,刚好达到阈值)使用公式:newIndex = hash & 15(因为16-1=15)例如容量10:9 → 二进制 01001,hash & 9不能均匀分布。1.5倍扩容:元素可能迁移到5个不同位置。新位置:11(原位置3 + 旧容量8)新位置:1(与原位置相同)新位置:3(与原位置相同)新位置:5(与原位置相同)
2025-08-10 11:43:04
398
原创 HashMap寻址算法
本文提供了HashMap解决哈希冲突的图示解析,包含两个示意图展示哈希冲突的不同处理方式。同时附上了相关Java集合核心原理的源码地址,该源码位于GitHub仓库的collections/HashMap目录下,具体文件名为addressing.html,可供开发者参考学习HashMap的底层实现机制。
2025-08-07 23:19:29
292
原创 异或运算的高位分析
本文介绍了HashMap的实现原理,包含两张示意图展示其内部结构,并提供了相关源码地址。图示展示了HashMap的存储结构和哈希冲突处理方式。源码位于GitHub仓库的java-core-principles项目中,具体路径为collections/HashMap/hashmap.html,可供开发者进一步研究HashMap的实现细节。内容简明扼要地呈现了HashMap的核心实现要素。
2025-08-07 00:13:09
375
原创 03 Broker主从架构和集群模式
摘要:Broker主从架构包含Master和Slave节点,Master处理写操作和读请求,Slave作为只读节点分担消费请求。数据同步提供异步复制(高性能)和同步双写(强一致)两种模式。故障转移流程包括:NameServer检测Master宕机后标记Broker组不可写,将Slave升级为可读节点,消费者自动重连继续消费。该架构通过角色分工和自动故障转移实现高可用消息服务。
2025-08-01 22:55:27
357
原创 02 NameServer是如何管理Broker集群的
摘要:RocketMQ的Broker通过注册与心跳机制(每30秒)向NameServer集群上报信息,NameServer使用RouteInfoManager管理路由元数据,包括Broker基础信息、Topic路由和存活状态。NameServer每10秒检测Broker活跃度,超时(120秒)则剔除故障节点并清理路由。客户端定期(30秒)从NameServer获取路由信息,支持高可用。NameServer采用去中心化设计,多节点独立运行,通过最终一致性和客户端自动切换实现容灾。
2025-07-30 21:03:21
307
原创 Docker镜像瘦身:从1.43G到22.4MB
从 DockerHub(官方 Docker 镜像注册表)中我们可以看到,基于 alpine-based 的 Node 镜像比基于 Ubuntu 的镜像小得多,而且它们的依赖程度非常低。因此,现在我们将引入多级构建的概念,以减少不必要的代码和依赖于我们的最终镜像。我们尝试使用 Nginx 这类更高效、更轻量级的服务器来运行资源应用程序,也可以尽可能提高其性能,并且减少镜像的量。在查询结果列表的顶部,是我们新创建的图像,在最右边,我们可以看到图像的大小。这样我们在最终的镜像中就不会有不必要的依赖和代码。
2024-12-30 22:07:29
974
原创 charls基于夜神模拟器抓取安卓7.0应用程序https请求
然后把hash值.0移到安卓设备/system/etc/security/cacerts/里。接下来就把下载charls的证书 charls.pem 改名为生成的hash值.0。查看证书 已经到了系统证书下了。已经可以抓到https的包了。
2024-09-15 22:57:25
833
原创 动手实现一个可发送短信随机密码的高安全性用户密码系统
现假设我们是某个社交网站,对于每个新来的用户,我们可能都需要注册之后,才能进行使用网站的功能,但是对于注册流程,可能每个网站的流程都不一样,假设我们社交网站的注册流程为,先填写用户名和手机号,点击注册之后,系统注册成功之后,会创建一个随机密码,通过短信发送给用户,以后用户可以用该密码进行登录,也可以自己修改密码,我们来看一下整体的业务流程图。通过ThreadLocal来实现高安全性用户密码系统发送随机密码案例。用一个异步方式去处理随机密码的生成和随机密码短信的下发的任务,请看下图。
2024-06-25 20:55:32
1070
原创 线程本地化存储如何保证线程安全
我们把代码还原到图中,int c = a + b,基本类型的局部变量是存在栈空间,而new Object()代码创建的的对象实例的确是存在虚拟机的堆空间里,但是Object object只是引用(reference)堆空间里的对象,重要的事情说三遍,是引用,是引用,是引用,而new Object()这个对象只有被当前线程的自己所引用,我们再来看下面这张图。因为变量不共享,就不存在线程安全问题。当方法返回的时候,方法对应的栈帧,也会在栈空间被弹出,同时,执行的方法和对应的栈帧是同生共死的关系。
2024-06-18 13:57:43
973
原创 探秘提交任务到线程池后源码的执行流程
7]如果说线程池状态确实是RUNNING,也就是二次校验通过,那么就判断一下线程池里是否还有线程,通过WorkerCountOf(recheck) == 0来判断,如果返回true了,就说明当前线程池中是空的,没有线程。对于核心线程来说,他们可以无限制的等待着任务被获取并执行,而非核心的线程则是在有限的时间内获取任务,一旦Worker无法获取到任务,也就是要获取的任务为空,循环就会结束,Worker自己就会主动的去除掉在线程池中的应用,进而被回收掉并退出。这个方法实际上最终就是开启了新的线程去执行任务。
2024-06-17 17:16:14
1060
原创 分析线程池的构造过程,追踪核心成员变量
这部分线程给他们分配了一个keepAliveTime参数,意义在于,当没有可处理的任务时,让它们别急着回收,而是先等会儿,看有没有任务来了,如果有就去执行任务,否则就等达到了keepAliveTime之后,对工作线程进行回收。也就是上图中的“最大池maximumPool”的容量,它的作用在于,当核心线程数被任务占满,且其中的任务缓冲队列也满了的时候,让新提交的任务仍旧可以执行,不至于立马就被拒绝。如下图中的核心池Pool中的线程池的数量,代表的含义就是这里的corePoolSize,如图。
2024-06-17 16:52:50
954
原创 如何避免重复创建线程?创建线程池的方式有哪些?各自优缺点有哪些?
这里还要强调的一点是,在Java语言中,当我们每创建一个线程的时候,Java虚拟机就会在JVM内存中创建出一个Thread对象,与此同时创建一个操作系统的线程,最终在系统底层映射的是操作系统的本地线程(Native Thread),在windows系统中是1对1映射(即一个Java线程映射一个操作系统线程),在Linux系统是N对M映射(即多个Java线程映射多个操作系统线程,N与M不完全相等),这里就仅做了解,不详细展开了,感兴趣的同学可以去看一下操作系统的线程部分的知识。这玩意儿也是要占用内存空间的。
2024-06-16 11:12:46
1311
原创 实现智能安防系统的报警功能(一)
这些产品都需要报警功能,一旦监察到异常,就会向报警中心服务器上传报警信息,然后由报警中心程序通知对应的人员或者系统进行处理。建立定时器,并每隔5秒发送一次心跳检查,如果与告警中心服务器的连接断开,则重新建立连接。HeartbeatTask()心跳检查,新建定时调度线程,每隔n秒去检查一次连接。init: 初始化报警服务,和报警服务器建立连接,并定时发送心跳信息。通过blocker去唤醒一个线程,与告警中心服务器建立连接。4、烟雾报警器、燃气探测器。3、门磁、人体探测器。
2024-06-16 10:17:37
484
原创 如何解决百万交易系统转账过程中循环等待,性能太差的问题?
死锁” 是两个或两个以上的线程在执行过程中,互相持有对方所需要的资源,导致这些线程处于等待状态,无法继续执行。若无外力作用,它们都将无法推进下去,就进入了“永久”阻塞的状态。如上图所示:线程01获得了账户A的锁,且同时去尝试获取账户B的锁;但是,线程02已经获得了账户B的锁,所以,线程01只能等待。同样,线程02也无法获得账户A的锁(已被线程01获取),只能等待。于是,线程01和线程02都在等待对方持有的锁,且会无限期的等待下去,这就是我们所说的“死锁”了!
2024-06-15 21:29:11
969
原创 线程在执行过程中的状态是如何流转的?
当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。线程一旦终止了,就不能复生。所以,当这个线程要执行时,就必须调用这个对象的start()方法,将NEW 状态转换到 RUNNABLE 状态。线程执行完 run() 方法后,会自动转换到 TERMINATED 状态,当然如果执行 run() 方法的时候异常抛出,也会导致线程终止。我们为了验证线程run()后,会自动转到terminated状态,所以,使用thread.getState()方法来获取“线程状态”。
2024-06-15 20:57:06
876
原创 数据库与缓存⼀致性⽅案
⾸先我们对于所有的DB操作都不去添加具体的删除缓存的操作,⽽是通过canal监听binlog的⽅式,待数据确认已提交到数据库后,通过监听的变化,解析出对应的数据后,过滤掉⾮增删改的binlog,然后通过常量类配置的需要处理数据⼀致性的相关表以及关键字段和缓存前缀key,进⾏组装出需要进⾏删除的缓存key。现有的业务场景下,都会涉及到数据库以及缓存双写的问题,⽆论是先删除缓存,再更新数据,或者先更新数据,再删除缓存,都⽆法保证数据的⼀致性。本身他们就不是⼀个数据源,⽆法通过代码上的谁先谁后去保证顺序。
2024-06-01 22:15:43
992
原创 你们系统每天有多大访问量?每个服务高峰QPS多少?压测过服务最大QPS吗?
在自己负责的系统里 核心模块 开发一个简单的metrics统计机制,AtomicLong,,原子性,并发下数据统计准确,每个接口被调用的时候,可以对每个接口做一个metrics统计。任何一个开源系统 都需要对自己运行过程中各种请求量,每秒的请求量、成功次数、失败次数,在内存里做一个计数,他会给你开放一些端口号,只要请求这些端口号,就会把metrics统计返回。对每个接口 每天的请求使用atomicLong做一个计数,统计每天的请求次数。
2024-06-01 18:58:22
388
原创 最新的G1垃圾回收器的工作原理,你能聊聊吗?
所以简单来说,G1可以做到让你来设定垃圾回收对系统的影响,他自己通过把内存拆分为大量小Region,以及追踪每个Region中可以回收的对象大小和预估时间,最后在垃圾回收的时候,尽量把垃圾回收对系统造成的影响控制在你指定的时间范围内,同时在有限的时间内尽量回收尽可能多的垃圾对象。然后在垃圾回收的时候,G1会发现在最近一个时间段内,比如1小时内,垃圾回收已经导致了几百毫秒的系统停顿了,现在又要执行一次垃圾回收,那么必须是回收上图中那个只需要200ms就能回收掉20MB垃圾的Region啊!
2024-05-28 21:35:53
895
原创 什么情况下JVM内存中的一个对象会被垃圾回收?
有GC Roots引用的对象不能回收,没有GC Roots引用的对象可以回收,如果有GC Roots引用,但是如果是软引用或者弱引用的,也有可能被回收掉。其实这里比较常用的,就是强引用和软引用,强引用就是代表绝对不能回收的对象,软引用就是说有的对象可有可无,如果内存实在不够了,可以回收他。然后如果新生代里的对象越来越多,都快满了,此时就会触发垃圾回收,把新生代没有人引用的对象给回收掉,释放内存空间。所以说,只要你的对象被,方法的局部变量,类的静态变量给引用了,就不会回收他们。
2024-05-28 21:10:56
1071
原创 如果任务过多,队列积压怎么处理?
好了,相信大家已经对多路复用的IO模型已经有一个初步的认识了,那么我们现在把购物狂生活中一起构建出IO多路复用场景中的角色抽象成代码模型大概是什么样的。首先我们不妨来看看,这个在没有收到快递员信息的情况向下,让购物狂先静静的等待一会儿,如果收到快递小哥来电就可以在小区里的站点展开快递搜索的行为叫做select,也就是说select是一个阻塞方法,既然它是一个IO多路复用里的通用行为,那么自然就跟我们业务代码无关,肯定是有一个在这套模型里有拥有这个方法的接口或类。
2024-05-27 22:57:45
1706
集桌面应用、命令行工具与 Web 应用于一体的全功能 MQTT 客户端工具
2023-07-31
mongodb安装包
2019-01-23
java实现FTP批量大文件下载
2019-01-15
vue 后台管理系统
2018-11-09
JDK1.8版本
2018-04-03
AdventureWorksDW2008R2
2018-11-08
angularJs需要导入的JS文件
2019-03-31
品优购建表语句
2019-03-24
dubbox的jar包
2019-03-26
jboss-4.2.0.GA
2018-02-02
JDK1.7版本
2018-04-03
xenu web链接测试工具
2018-11-09
apache-tomcat-6.0.32_xzfwoa
2018-02-05
jdk-8u151-linux-x64.tar.7z
2019-05-19
apache-activemq-5.15.0-bin.tar.7z
2019-05-19
spring Boot 入门
2018-09-27
redis win32andwin64
2018-09-28
JAVA开发常用文档
2018-12-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅