自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 收藏
  • 关注

原创 Java 是静态语言,静态语言是什么,那与动态语言的区别?

维度Java(静态)动态语言(如Python)核心特点编译期定类型、早检查运行期定类型、晚检查优点代码健壮(提前排错)、性能高灵活、开发效率高缺点代码冗余(显式声明)、灵活性低易出运行时错误、性能稍低公众号名称:怪味Coding微信扫码关注或搜索公众号名称。

2025-11-27 16:51:57 483

原创 数据库连接池原理和设计

以下示例空闲连接回收,单独一个线程定时检查空闲连接,并关闭超时或坏的连接。

2025-11-20 08:30:00 138

原创 为什么会有分布式事务

假设有两个系统,一个是订单系统,另一个是库存系统。用户在订单系统中下单,已经保存到数据库,订单系统需要调用库存系统的接口来减少库存。因为是两个系统如果库存系统失败啦,这个时候,订单系统已经保存了数据,但是库存却没有减少。这样就出现问题所以分布式事务之所以存在,是因为在分布式系统中,单机数据库事务能力无法直接覆盖跨多个服务、多个数据库、多个资源的业务流程。为了保证业务数据的一致性,需要一种机制来协调不同节点的操作,要么全部成功,要么全部失败。

2025-11-19 17:08:30 315

原创 分布式缓存中,如何解决“缓存穿透、缓存击穿、缓存雪崩”这三大问题?

2025-11-19 14:11:48 331

原创 list.parallelStream() 的坑

问题说明使用哪个线程池?默认线程数CPU 核心数 - 1风险抢占 & 阻塞 & 调优难是否可用于 I/O 密集型?❌ 不推荐推荐替代自定义线程池 / CompletableFuture / Reactor。

2025-11-17 20:51:23 225

原创 Java 并发编程 - ThreadPoolExecutor

(最小线程)、(最大线程)、(空闲回收)、(线程创建);workQueue(任务缓冲)、handler(饱和处理);unit是时间单位辅助参数。合理配置需结合业务场景(如任务执行时长、任务提交频率、是否允许任务丢失),避免“一刀切”(如直接使用可能隐藏 OOM 风险)。

2025-11-13 21:00:54 979

原创 Java 并发编程 -ThreadPoolExecutor 线程创建/销毁逻辑

ThreadPoolExecutor 的线程不会自动销毁核心线程:默认“常驻”,空闲不销毁;开启后,空闲超时销毁;非核心线程:空闲超时()后自动销毁;线程池关闭时,所有线程会被强制销毁。这种设计的目的是平衡性能和资源消耗:复用线程减少创建/销毁开销,通过超时销毁避免空闲线程占用过多内存。

2025-11-12 12:09:49 469

原创 软件架构设计

软件架构设计 =结构化地组织系统组件 + 约束其协作方式 + 满足关键质量属性 + 支撑长期演化。架构实现过程 =从需求到演化的系统化工程,核心是持续地在“抽象设计”与“具体实现”之间找到平衡。

2025-11-03 12:57:33 490

原创 Java性能分析第五节 - Linux 下 Java应用性能案例

对应用程序进行性能优化,往往采用更加高效算法或数据结构,以减少 CPU调用,内存使用,更短的执行路径实现业务功能。

2025-10-30 18:47:23 374

原创 Java性能分析 - 第四节 - Linux 下 JVM监控

监控通常是指一种在生产,质量评估或者开发环境中带有预防或主动性的活动。当应用负责人收到性能问题却没有足以定位问题的线索,首先会查看性能监控,随后性能分析。

2025-10-28 21:23:12 247

原创 Java性能分析 - 第三节 - Linux 下 内存监控.

2核4Gwrk。

2025-10-27 21:16:36 746

原创 wrk 下载和安装

在国内环境下载wrk时,由于 GitHub 访问可能不稳定,可通过或两种方式解决。

2025-10-26 15:57:22 438

原创 Java性能分析 - 第二节 - Linux 下 CPU 监控

问题类型结论CPU 高占用✅ 由多线程同时执行 JSON 序列化/反序列化引起死锁❌ 无死锁阻塞❌ 无明显阻塞线程优化方向减少 JSON 转换、优化 fastjson2 使用、降低并发度。

2025-10-26 15:53:25 1165

原创 Java性能分析 - 第一节 - 策略,方法 和 方法论

在问题时间窗口做线程快照(thread dump)、火焰图或采样 profiler(async-profiler / JFR)。许多 profiler(async-profiler)支持同时输出火焰图(按方法)和调用图(calltree),用于把底层热点映射成调用链。观察慢请求的调用路径,找出耗时方法(IO、数据库、序列化、长锁、循环)并确认是真正瓶颈(占比高/可复现)。优化算法、复用对象(对象池 / 重写为原始类型)、减少同步粒度、改为无锁/并发结构、改异步 IO、批量化。的一种性能分析方法。

2025-10-26 10:33:55 251

原创 Java 主流垃圾回收器优缺点

Java 各主流垃圾回收器(GC)——的优缺点。

2025-09-04 21:40:38 686

原创 实现一个简单的MCP Client

编写 mcp_client.py。使用 uv 创建项目和依赖。运行代码,可以看到输出。

2025-07-25 16:18:01 293

原创 实现一个简单的MCP Server

在MCP Host 中配置该server。这里用到的是 Cursor 中 Roo Code, 没有的可以在插件市场中下载. 编辑 Project Config。配置完成后,配置成功的会有个小绿点,注意不是开关按钮,那个开关按钮是控制 MCP 是否启用。mcp_server 代码实现,使用标准输出。安装 uv && 初始化项目。安装依赖 FastMCP。

2025-07-25 12:56:10 747

原创 Reactor 和 Proactor 这两个高性能网络模式。

常见的 Reactor 实现方案有三种。第一种方案单 Reactor 单进程 / 线程,不用考虑进程间通信以及数据同步的问题,因此实现起来比较简单,这种方案的缺陷在于无法充分利用多核 CPU,而且处理业务逻辑的时间不能太长,否则会延迟响应,所以不适用于计算机密集型的场景,适用于业务处理快速的场景,比如 Redis(6.0之前 ) 采用的是单 Reactor 单进程的方案。

2025-07-24 16:12:59 667

原创 什么是零拷贝

磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。早期 I/O 操作,内存与磁盘的数据传输的工作都是由 CPU 完成的,而此时 CPU 不能执行其他任务,会特别浪费 CPU 资源。

2025-07-24 16:10:14 471

原创 微服务改造,本质是业务问题驱动的技术决策

微服务是为了解决业务规模扩展、组织协作、系统复杂度问题而引入的架构方式,技术只是实现手段,业务才是核心动因。

2025-07-23 15:32:11 282

原创 GIT取消跟踪已提交的文件

一、通过修改.gitignore忽视某个文件但是发现这个文件还是会被踪,只对没有被git commit 过的文件有效,也就是说如果你的文件被commit过后你再修改gitignore,这个时候gitignore对这个文件是无效的,这个时候就需要取消对某个文件的跟踪。1、git rm -r -n --cached 文件或目录,列出你需要取消跟踪的文件,可以查看列表,检查下是否有误操作导致一些不应该被取消的文件取消了,是为了再次确认的。2、git rm -r --cached 文件,取消缓存不想要跟踪的文件。

2025-07-23 14:46:11 532

原创 ToB软件设计

企业应用是一种计算机程序,主要用来满足企业的需求,而非独立的用户。一些大家可能用过或者见过的企业软件在现代企业中,大多数企业应用是复杂、可拓展、分布式、模块化的,并且承担着重要功能。企业软件对大量数据进行展示、处理和存储,这些数据往往非常复杂,并且是整个商业流程的根基。使用企业应用可以帮助你构件你的产品,帮助企业和员工更好的完成工作。注:虽然B2B和企业应用在定义上有一些小差别,但这些差别在目前的软件生态中几乎没有什么影响,所以这里把他们放在一起描述了。

2025-07-23 14:41:58 1582

原创 To B软件设计原则

我们与客户进行沟通时听到的最多的一个词。如果将“高效”推向极致,很大一部分用户会被吓到,他们在操作过程中只会不断的出错,对于用户来说 这是一种高昂的成本。对于产品,特别是企业类型的产品,完成目标任务永远是第一位的。美观是提升体验、激发愉悦的重要手段,但对于我们来说,不可能将它的重要 性排在其他任何设计原则之前。最终,我们提炼出了四点最核心的原则,以帮助我们塑造设计思维,进而对具体的方案进行评判,做出正确的设计决策。对于相同的问题,提供相同的解决方案,减轻用户的认知及记忆负荷,使界面操作方式更符合直觉。

2025-07-23 14:33:09 252

转载 CRM项目实战(四):零售行业的几个核心商业逻辑

那么,线下实体店背后有哪些核心的商业逻辑呢?

2025-07-23 14:29:33 82

转载 CRM项目实战(三):客户特征=>客户识别 +管理

他们的拜访是否有效果?当然,作用还不仅仅如此,比如提高客户粘性,我们发现通过定向补贴,客户往往还会购买除补贴商品之外的商品,这也是我之前提到的一站式购物体验(二批商一般运营品类狭窄,仅仅只是某些单品价格有优势,无法满足客户多品且价优的需求)。于是,我们有了为便利店赋能的方案,即改造资质还不错的便利店(改造的目的是扩品,提升店铺内空间利用效率)。举例M:我们取单位时间内,所有客户累计下单金额的平均值,那么,必然有客户高于平均值,有客户低于平均值,共2种情况,同理R、F也有2种情况,共8种(2^3)。

2025-07-23 14:28:06 150

转载 CRM项目实战(二):获取客户篇

关于结果数据这块,我的设计理念是销售专员是管客户的,上级是管人的(数据向上归集,政策向下推进,透过管人实际上也在管客户)。结合我所在公司的情况,我们的销售团队习惯按照客户意向和客户潜在价值两个维度综合判断,将客户分成A(好)、B(一般)、C(差)三类,这种分类方式是纯经验主义的主观判断(优缺点明显,优点是方便销售本人管理和识别客户,缺点是由于销售经验和主观判断的差异性,同一个客户在销售甲眼里可能是A类,而在销售乙眼里却是C类,导致无法从公司层面整齐划一的制定拜访策略,同时还不利于客户的流转等等)。

2025-07-23 14:26:56 146

转载 CRM项目实战(一):概念和业务篇

比如通过销售团队的陌生拜访(陌拜这个词最早应该是源于阿里中供铁军,销售无预约直接上门拜访客户),亦或是技术手段抓取(如竞对/地图类网站爬取客户信息),还有一些是客户主动提供的信息,比如产品同学在体验竞品时,经常会注册体验账号,一般过一段时间,竞品公司的销售就会打电话问你是否需要购买xxx产品。在上图中,从左下角开始到右上角结束依次有:潜在客户》低价值客户》高价值客户,我们期望通过CRM系统,让客户从潜在客户开始,一步一步转变成高价值客户,并且维持高价值客户的消费状态,从而达到企业盈利的目的。

2025-07-23 14:21:04 120

原创 Thread-Per-Message 模式、Worker Thread 模式、生产者-消费者模式

模式分工机制优点缺点适用场景每请求一个线程简洁、无共享高并发下资源耗尽简单 socket 服务固定线程 + 任务分配线程重用、高效调度逻辑稍复杂Web 服务/任务队列队列缓冲 + 解耦异步解耦、限流控制复杂度高日志处理、流水线任务。

2025-07-22 22:04:06 409

原创 并发编程:COW(Copy-On-Write,写时复制)

/ 原子替换。

2025-07-22 16:18:02 522

原创 并发编程:JDK7 和 JDK8 的 ConcurrentHashMap 锁实现方案

项目核心结构Node[] + 链表/红黑树加锁方式锁住 Segment(ReentrantLock)锁桶头(synchronized)+ CAS并发读无锁,volatile + final 保证无锁,volatile 保证并发写锁一个 Segment(最多16个并发)精确到桶 + CAS,自旋扩容扩容全表加锁迁移多线程协作迁移(transferIndex)红黑树优化❌ 无✅ 桶内链表长度超过 8 转红黑树内存占用多 Segment 和锁,略高。

2025-07-22 15:59:07 461

原创 并发编程:无锁方案 CAS

类别Java 无锁类是否底层使用 CAS计数器LongAdder✅队列✅栈自定义/无锁链栈✅引用管理✅。

2025-07-22 15:43:41 449

原创 Semaphore 共享锁的唤醒策略设计

关键点说明唤醒一个节点避免惊群效应,保持传播的渐进式唤醒被唤醒节点负责唤醒下一个通过中的传播机制(propagate)共享模式可以多个线程并发执行但唤醒是串行传播的,获取许可成功的线程才会继续传播唤醒后续。

2025-07-22 15:11:07 324

原创 AQS(AbstractQueuedSynchronizer)

state控制资源状态(独占锁、共享锁的核心)CLH 队列保障线程公平有序等待锁队列是双向链表结构,便于通知前后节点CAS + volatile + LockSupport 保证了线程安全和性能等待队列与同步队列之间的跳转机制tryAcquiretryRelease如何在子类中自定义共享模式下的队列传播(PROPAGATE欢迎继续提问。

2025-07-22 14:24:56 572

原创 并发编程:可重入锁、不可重入锁、公平锁、非公平锁

wait();notify();分类可重入锁不可重入锁定义同一线程可以重复获取已持有的锁同一线程重复获取锁会阻塞自己例子自定义锁或极简实现是否阻塞自身否是死锁风险小大分类公平锁非公平锁加锁顺序先进先出插队,谁抢到谁执行实现方式性能较低,避免饥饿较高,但可能造成饥饿使用场景任务调度敏感、公平性重要性能优先,锁竞争激烈。

2025-07-21 22:16:40 547

原创 并发编程中死锁、活锁、饥饿

问题是否阻塞是否有进展CPU 占用根本原因解决方式死锁是无低互相等待资源加锁顺序、一致性、tryLock活锁否无高反复让步或重试加延迟、限制重试、协调机制饥饿否无低~正常资源分配不均公平锁、任务公平调度。

2025-07-21 22:13:14 497

原创 并发编程:ReentrantLock + Condition

是一种可重入互斥锁。与更高的灵活性(可以手动加锁/释放锁)更丰富的功能(如支持公平锁、可中断锁、尝试加锁等)try {// 临界区Condition是用来代替Object的wait()notify()的。它允许多个线程在一个Lockawait():当前线程等待(释放锁并挂起)signal():唤醒一个等待的线程:唤醒所有等待线程Condition必须通过Lock是比传统更加强大和灵活的线程协作机制,适用于更复杂的并发控制场景。存在多个等待队列(条件变量)

2025-07-21 16:12:52 460

原创 并发编程:Java 线程生命周期

触发事件状态变迁start()被调用获得 CPU 执行时间片执行wait()执行sleep()join(ms)等待锁资源被notify()唤醒超时等待结束获取到锁run()方法执行完毕任意状态 →TERMINATED。

2025-07-21 14:36:35 156

原创 并发编程:Java 如何解决 可见性,有序性和原子性

并发问题典型现象Java 解决机制可见性线程 A 修改变量,线程 B 看不到volatilefinal有序性指令被重排序,行为反直觉volatile、JMM 顺序规则原子性多线程修改共享变量,结果错误LockAtomicXXX、并发容器。

2025-07-21 14:03:00 454

原创 gcore 进行Java内存分析,特别是发生OOM的情况

gcore是 Linux 系统中用于生成某个进程当前内存快照(core dump)的工具,可以用来分析 Java 进程的内存问题,比如内存泄漏、对象分布等。下面是如何使用gcore。

2025-07-21 11:31:33 599

原创 为什么并发编程容易出问题

Java 并发问题的本质,是在“多个线程共享变量”+“非原子操作”+“不可见内存”+“不确定调度” 的多重组合下,引发状态错乱和 bug。

2025-07-21 11:17:39 753

空空如也

空空如也

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

TA关注的人

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