<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[klcss的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/klcss</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; klcss]]></copyright><item><title><![CDATA[Java线程通信]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/151264166</link><guid>https://blog.youkuaiyun.com/klcss/article/details/151264166</guid><author>klcss</author><pubDate>Sat, 06 Sep 2025 23:16:08 +0800</pubDate><description><![CDATA[由于现代CPU的多级缓存架构和编译器的优化（如指令重排序），一个线程对共享资源的修改可能不会立即被其他线程看到，导致其他线程使用过期的数据。控制多个线程对共享资源的访问顺序，确保在任一时刻只有一个（或特定数量的）线程可以访问临界资源，从而避免竞争条件。这是线程通信的“安全”目的。多个线程同时读写共享资源（如一个变量、一个数据结构、一个文件等），导致最终结果依赖于线程执行的精确时序，从而产生不可预测、错误的结果。没有有效的线程通信机制，多线程程序就会陷入混乱，结果不可预测，也就是我们常说的“线程不安全”。]]></description><category></category></item><item><title><![CDATA[MySQL深分页的处理方案]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/150656517</link><guid>https://blog.youkuaiyun.com/klcss/article/details/150656517</guid><author>klcss</author><pubDate>Sat, 23 Aug 2025 23:08:32 +0800</pubDate><description><![CDATA[其核心思想是：不使用固定的页码（Page），也不使用偏移量（OFFSET），而是使用上一页最后一条记录的唯一标识（如自增ID、时间戳）作为“游标”来获取下一页的数据。后台系统可以限制 offset 的最大值（例如最大只能取 1000），或者当 offset 超过一个阈值（如 1000）时，提示用户“请使用更精确的筛选条件来缩小范围”。仍然是 OFFSET 方案，跳过的记录越多，子查询扫描索引的范围依然很大，只是比回表全记录要轻量很多。架构复杂，需要引入和维护新的中间件，有数据同步延迟。]]></description><category></category></item><item><title><![CDATA[流式查询：逐条返回]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/150393450</link><guid>https://blog.youkuaiyun.com/klcss/article/details/150393450</guid><author>klcss</author><pubDate>Thu, 14 Aug 2025 16:14:59 +0800</pubDate><description><![CDATA[MyBatis 提供了 Cursor 接口，它本质上是对 JDBC ResultSet 的一个包装。当使用 Cursor 时，MyBatis 不会一次性将所有结果加载到内存中，而是逐行从数据库读取。我们可以将这个逐行的、阻塞的迭代过程，转换成一个非阻塞的、异步的 Flux 数据流。]]></description><category></category></item><item><title><![CDATA[Java泛型（补档）]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/147637898</link><guid>https://blog.youkuaiyun.com/klcss/article/details/147637898</guid><author>klcss</author><pubDate>Wed, 30 Apr 2025 18:32:08 +0800</pubDate><description><![CDATA[Java 泛型是 Java SE 1.5 引入的一项重要特性，它的核心思想是 参数化类型（Parameterized Types），即通过将数据类型作为参数传递给类、接口或方法，使代码能够灵活地处理多种类型，同时保证类型安全性。在类名后添加类型参数 <T>，T 是占位符（可以是任意标识符）,声明后类的占位符会被替换成对应类型。泛型方法可用于编写通用的工具类，例如排序、查找等。]]></description><category></category></item><item><title><![CDATA[SpringBoot集成RabbitMQ]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/146298018</link><guid>https://blog.youkuaiyun.com/klcss/article/details/146298018</guid><author>klcss</author><pubDate>Sun, 16 Mar 2025 17:33:37 +0800</pubDate><description><![CDATA[RabbitMQ 是一个开源的消息队列软件（有时也被称为消息代理），它实现了高级消息队列协议（AMQP）。它主要用于应用程序之间，或者软件组件之间的消息通信。通过使用 RabbitMQ，可以实现异步的、可靠的、可扩展的消息处理机制，这使得它成为构建分布式系统时的一个理想选择。解耦服务：在微服务架构或分布式系统中，服务之间可以通过消息队列进行通信，从而实现松散耦合。这样做的好处是，即使某些服务出现故障，也不会影响到整个系统的运行。异步处理：对于一些不需要立即响应的操作，可以采用异步的方式进行处理。]]></description><category></category></item><item><title><![CDATA[RocketMQ详解]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/146287623</link><guid>https://blog.youkuaiyun.com/klcss/article/details/146287623</guid><author>klcss</author><pubDate>Sun, 16 Mar 2025 00:30:56 +0800</pubDate><description><![CDATA[RocketMQ 是一个分布式消息中间件，具有高吞吐量、低延迟、可靠性高等特点。它广泛应用于大规模分布式系统中，用于解耦服务之间的直接调用、异步处理、流量削峰等场景。]]></description><category></category></item><item><title><![CDATA[Java常用设计模式]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/146269533</link><guid>https://blog.youkuaiyun.com/klcss/article/details/146269533</guid><author>klcss</author><pubDate>Fri, 14 Mar 2025 23:50:35 +0800</pubDate><description><![CDATA[        设计模式是软件开发中解决常见问题的模板或指南。Java中的23种设计模式通常被分为三大类：创建型（Creational Patterns）、结构型（Structural Patterns）和行为型（Behavioral Patterns）。]]></description><category></category></item><item><title><![CDATA[MyBatis的＜association＞、＜collection＞（补档）]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/146229503</link><guid>https://blog.youkuaiyun.com/klcss/article/details/146229503</guid><author>klcss</author><pubDate>Thu, 13 Mar 2025 14:11:06 +0800</pubDate><description><![CDATA[association>用于一对一的关联映射，表示外部对象是一个单独的实例。<collection>用于一对多的关联映射，表示外部对象包含了一个集合或列表的实例。]]></description><category></category></item><item><title><![CDATA[Java 事务:@Transactional 、@GlobalTransactional]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/146199793</link><guid>https://blog.youkuaiyun.com/klcss/article/details/146199793</guid><author>klcss</author><pubDate>Wed, 12 Mar 2025 11:26:26 +0800</pubDate><description><![CDATA[使用 @Transactional 来管理单个服务内的本地事务。使用 @GlobalTransactional 来管理涉及多个服务或资源的分布式事务，确保跨服务调用之间的一致性。异常处理：默认情况下只有遇到运行时异常和错误时才会触发回滚。可以通过属性rollbackFor指定其他类型的异常也触发回滚。传播行为：可以使用propagation属性定义事务的传播行为，比如是否在一个已存在的事务中运行还是创建新的事务。隔离级别：通过isolation属性设定事务的隔离级别。]]></description><category></category></item><item><title><![CDATA[Redisson分布式锁框架]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/146140612</link><guid>https://blog.youkuaiyun.com/klcss/article/details/146140612</guid><author>klcss</author><pubDate>Mon, 10 Mar 2025 00:19:27 +0800</pubDate><description><![CDATA[Redisson是一个用于Redis的Java客户端，它极大地简化了分布式锁、分布式集合、分布式服务等复杂场景下的开发工作。Redisson提供了丰富的功能，并且对分布式锁的支持尤为强大和灵活。]]></description><category></category></item><item><title><![CDATA[Java 分布式锁]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/146083161</link><guid>https://blog.youkuaiyun.com/klcss/article/details/146083161</guid><author>klcss</author><pubDate>Thu, 06 Mar 2025 23:55:26 +0800</pubDate><description><![CDATA[该代码示例展示了如何使用上述表来获取和释放锁，并执行相应的业务逻辑（例如更新库存），在请求A对业务进行操作的时候，假设请求B也进入到此方法，则会由于锁表的唯一索引lock_name而导致插入失败，导致其操作被拒绝，而主键则需要针对不同业务场景设置，不同业务场景不会触发锁机制。此外，由于使用的是临时节点，如果客户端崩溃或与ZooKeeper断开连接，该节点也会自动被删除。，数据库会在查询过程中给数据库表增加排他锁，当某条记录被加上排他锁之后，其他线程无法再在该行记录上增加排他锁，而事务提交后会自动释放锁。]]></description><category></category></item><item><title><![CDATA[Java锁]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/145814651</link><guid>https://blog.youkuaiyun.com/klcss/article/details/145814651</guid><author>klcss</author><pubDate>Sun, 23 Feb 2025 21:42:07 +0800</pubDate><description><![CDATA[这是一种硬件指令级别的操作，用于实现乐观锁。它不使用锁，而是通过比较预期值与当前值是否相同来决定是否更新数据。如果不同，则说明数据已经被其他线程修改过，需要重新尝试。do {// 获取当前值// 计算新值// 使用CAS尝试更新值} while (!@Test// 输出：Updated Value: 1：synchronized关键字-可用于代码块和方法是Java中的一种同步机制，可以视为悲观锁。可重入锁：允许同一个线程多次获取同一把锁。]]></description><category></category></item><item><title><![CDATA[@Async注解]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/145510405</link><guid>https://blog.youkuaiyun.com/klcss/article/details/145510405</guid><author>klcss</author><pubDate>Sat, 08 Feb 2025 10:48:25 +0800</pubDate><description><![CDATA[Async 是 Spring 框架中用于声明异步方法的注解。使用此注解的方法会在一个独立的线程中执行，而不是在调用者的线程中，从而实现非阻塞操作。]]></description><category></category></item><item><title><![CDATA[SpringBoot的过滤器、拦截器、监听器（补档）]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/145457399</link><guid>https://blog.youkuaiyun.com/klcss/article/details/145457399</guid><author>klcss</author><pubDate>Wed, 05 Feb 2025 16:40:39 +0800</pubDate><description><![CDATA[在Java Web开发中，过滤器（Filter）、拦截器（Interceptor）和监听器（Listener）是三种不同的机制，它们分别用于处理不同类型的任务。]]></description><category></category></item><item><title><![CDATA[Java Event 事件]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/145433634</link><guid>https://blog.youkuaiyun.com/klcss/article/details/145433634</guid><author>klcss</author><pubDate>Mon, 03 Feb 2025 22:08:06 +0800</pubDate><description><![CDATA[Spring框架中的事件（Event）机制是基于观察者模式实现的，它提供了一种简单的方式来通知应用程序中的不同部分发生了某些事情。通过Spring的事件机制，你可以在应用中发布和监听自定义事件，从而实现组件之间的松耦合通信。]]></description><category></category></item><item><title><![CDATA[CompletableFuture多线程]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/144176565</link><guid>https://blog.youkuaiyun.com/klcss/article/details/144176565</guid><author>klcss</author><pubDate>Sun, 29 Dec 2024 23:39:37 +0800</pubDate><description><![CDATA[CompletableFuture 是 Java 8 引入的一个类，位于 java.util.concurrent 包中。它是 Future 接口的一个实现，但提供了更多的功能和灵活性来处理异步计算。相比于传统的 Future，CompletableFuture 允许以非阻塞的方式编排和组合异步任务，并且可以通过链式调用、异常处理等功能简化异步编程。]]></description><category></category></item><item><title><![CDATA[HTTP响应内容压缩（处理响应内容过大的场景）]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/144506699</link><guid>https://blog.youkuaiyun.com/klcss/article/details/144506699</guid><author>klcss</author><pubDate>Mon, 16 Dec 2024 13:36:24 +0800</pubDate><description><![CDATA[如果单体应用中不同部分有不同的压缩需求，可以通过代码逻辑或更细粒度的配置来实现差异化的压缩策略，但这相对复杂一些。如果服务器和客户端之间的网络连接已经很快，那么压缩带来的额外处理时间可能抵消甚至超过它所带来的节省。性能监控：无论是在微服务还是单体项目中，启用响应压缩后都应该密切关注系统的性能指标，确保压缩确实带来了预期的性能提升，而没有引入不必要的CPU负载或其他问题。统一管理：在一个微服务架构中，虽然每个服务可以有自己独立的配置，但为了简化管理和维护，推荐对类似的微服务使用统一的配置管理工具或默认值。]]></description><category></category></item><item><title><![CDATA[MySQL中FIND_IN_SET()函数与IN()的区别与使用]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/144243991</link><guid>https://blog.youkuaiyun.com/klcss/article/details/144243991</guid><author>klcss</author><pubDate>Wed, 04 Dec 2024 16:43:30 +0800</pubDate><description><![CDATA[在MySQL中，函数和IN操作符有着不同的用途和使用场景。]]></description><category></category></item><item><title><![CDATA[Stream 的 flatMap 和 map 方法]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/143190640</link><guid>https://blog.youkuaiyun.com/klcss/article/details/143190640</guid><author>klcss</author><pubDate>Wed, 23 Oct 2024 18:15:20 +0800</pubDate><description><![CDATA[map方法super T,?flatMap方法super T,?map：适用于将流中的每个元素转换为另一个对象，但不会改变流的结构。flatMap：适用于将流中的每个元素转换为一个流，并将这些流合并成一个单一的流，从而展平嵌套的结构。]]></description><category></category></item><item><title><![CDATA[Java 线程池]]></title><link>https://blog.youkuaiyun.com/klcss/article/details/142030310</link><guid>https://blog.youkuaiyun.com/klcss/article/details/142030310</guid><author>klcss</author><pubDate>Sun, 08 Sep 2024 17:55:00 +0800</pubDate><description><![CDATA[默认的线程创建不可复用，执行完会销毁，重复创建和销毁会浪费资源及时间。]]></description><category></category></item></channel></rss>