hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝
定义:
系统在检测到可能导致错误或异常的条件时,立即终止当前操作并抛出异常/错误,避免程序在错误状态下继续运行。其核心思想是“尽早暴露问题”。
核心特点:
典型应用场景:
Iterator
遍历集合时,如果集合被直接修改(非通过迭代器的方法),会抛出 ConcurrentModificationException
。List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> it = list.iterator();
list.remove("A"); // 直接修改集合
it.next(); // 抛出 ConcurrentModificationException(快速失败)
IllegalArgumentException
,避免后续逻辑处理无效数据。定义:
系统在发生错误时,通过冗余、容错或恢复机制继续运行,确保操作不会因错误导致灾难性后果。其核心思想是“优雅降级”。
核心特点:
典型应用场景:
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
-- 若任意语句失败,事务回滚(安全失败)
COMMIT;
CopyOnWriteArrayList
在迭代时基于数据快照操作,即使原集合被修改,迭代器仍能安全遍历。List<String> list = new CopyOnWriteArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> it = list.iterator();
list.add("D"); // 直接修改集合
it.forEachRemaining(System.out::println); // 输出 A,B,C(原快照数据)
维度 | 快速失败(Fail-Fast) | 安全失败(Fail-Safe) |
---|---|---|
错误处理 | 立即终止并抛出异常 | 尝试恢复或绕过错误,保持系统运行 |
设计目标 | 快速暴露问题,便于调试 | 提高系统可用性,避免崩溃 |
实现复杂度 | 简单(直接中断) | 复杂(需冗余、重试、回滚等机制) |
适用阶段 | 开发测试阶段 | 生产环境 |
典型场景 | 集合迭代、参数校验 | 分布式系统、数据库事务、金融交易 |
资源消耗 | 低(无需额外资源) | 高(需备份、日志、监控等) |
选择快速失败:
选择安全失败:
快速失败示例(Java HashMap):
多线程并发修改 HashMap
时可能触发快速失败,抛出 ConcurrentModificationException
。
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
for (String key : map.keySet()) {
map.remove(key); // 抛出 ConcurrentModificationException
}
安全失败示例(Kafka消息队列):
生产者发送消息失败时,通过重试机制确保消息最终成功投递(至少一次语义)。
Properties props = new Properties();
props.put("retries", 3); // 失败时自动重试3次
Producer<String, String> producer = new KafkaProducer<>(props);