杂项4

简介: 本内容涵盖Java中Lambda表达式对变量的final要求、锁机制中的synchronized使用注意事项、分布式锁与悲观锁的应用场景对比,以及Docker镜像文件(.tar)的正确处理方式。重点解析了多线程与多实例环境下资源竞争的解决方案,并提供代码示例和决策依据,适用于并发编程与微服务架构开发。

lambda式中对于变量要求是final的(不可被修改)(无法理解)

就是据变量必须是未进行修改的,比如

class Example {
    private Long instanceId; // 实例变量 - 可在 Lambda 中修改
    private static Long staticId; // 静态变量 - 可在 Lambda 中修改
    
    void process(Long paramId) { // 方法参数 - 隐式 final
        Long localId = null; // 局部变量 - 受限制
        
        localId = 123L; // 修改局部变量
        
        // Lambda 表达式
        Runnable task = () -> {
            instanceId = 456L; // ✅ 允许修改实例变量
            staticId = 789L; // ✅ 允许修改静态变量
            // localId = 999L; // ❌ 禁止修改局部变量
            // paramId = 000L; // ❌ 禁止修改方法参数
        };
    }
}
  1. 依赖 ≠ 加载
    引入模块只保证代码在类路径
  2. spring.factories = 加载门票
    决定哪些配置类会被考虑
  3. 条件注解 = 安全阀
    控制配置类是否真正生效
  4. 缺少条件注解 = 定时炸弹
    当类依赖缺失时必然爆炸

通过正确使用条件注解,可以确保:

  • MVC 配置只在传统 Web 应用生效
  • WebFlux 配置只在网关生效
  • 通用组件在所有环境可用
  • 各微服务技术栈和平共处

.taz文件使用的方式

你上传的 .tar 文件是 docker save 创建的,它是一个封装了完整 Docker 镜像结构(多层+元数据+标签)的特殊归档文件。它的目的是分发和备份整个 Docker 镜像。

  • tar -xzvf (解压缩): 适用于普通的文件或源代码压缩包,目的是获取里面的文件进行操作。
  • docker load: 是唯一正确处理 docker save 生成的 .tar 文件的方法。它的目的是将封装好的完整镜像导入到 Docker 引擎,使其立即可用于运行容器。解压这个特定的 .tar 文件会破坏其结构,导致 Docker 无法识别和使用它。


对于锁用户id的问题

示例    Long id

使用synchronized  必须要是对象,所以必须是包装类型,不能是long类型

synchronized (id)会存在常量池的问题,如果超过,对于Long类型,如果值在-128到127之间(默认情况下),会使用缓存(即同一个值返回同一个对象),但是超出这个范围,每次new Long()会创建新的对象。

- 例如:
Long a = 100L; // 在缓存范围内,同一个对象 Long b = 100L; 
// a == b 为true 
Long c = 200L; Long d = 200L;
// c == d 为false(因为200超出了缓存范围)

超出范围会导致锁失效(不同的对象)

直接使用userId.toString()也是不行,每次的对象都不同?? 导致无法锁住

userId.intern() 不行(intern()是string特有的方法)

解决方案:`userId.toString().intern()` 可以确保对于相同的用户id字符串,`intern()` 方法返回的是字符串常量池中的同一个字符串对象。这样,无论有多少个线程,只要用户id相同,它们都会锁定在同一个字符串对象上。(一种解决方案)

悲观锁针对单资源(如数据库行)的竞争,无论单线程或多实例;
分布式锁针对跨系统资源的全局协调,核心是多实例/多进程的互斥管理。

单例,多实例

  1. 看竞争资源:
  • 资源是数据库里的一行数据? -> 优先考虑数据库悲观锁 (行锁)。
  • 资源是一个文件、一个外部API配额、一段复杂业务逻辑、或者需要跨库操作? -> 必须用分布式锁。
  1. 看协调范围:
  • 只需要保证单个数据库写操作的原子性和隔离性? -> 数据库悲观锁足够。
  • 需要保证一系列操作 (可能跨多个SQL、服务、资源) 作为一个整体原子执行? -> 必须用分布式锁。
  1. 多实例 vs 数据库:
  • 多个实例操作同一个数据库 -> 对于纯粹且简单的数据库操作竞争,悲观锁 (行锁) 是首选高效方案。
  • 多个实例操作不同数据库 -> 悲观锁失效,必须用分布式锁。
  • 多个实例操作同一个数据库,但竞争涉及复杂逻辑链 -> 必须用分布式锁。

简单决策树(简化版):

text

需要协调多个实例访问共享资源吗?
  |
  |--> 资源是数据库里的一行/表,且操作是简单直接的数据库操作 (如单个UPDATE)?
        |
        |--> YES: 使用数据库悲观锁 (行锁/表锁) -> 高效,原生支持。
        |
        |--> NO: (资源是文件/API/复杂逻辑链/跨库操作)
               |
               |--> 使用分布式锁 -> 跨实例协调,保护任意资源或逻辑。

维度

适合行锁的场景

需要分布式锁的场景

操作类型

单个SQL写操作(UPDATE/DELETE)

多步骤业务逻辑(查询→判断→写)

原子性要求

仅需保证单次写操作的原子性

需保证整个业务链的原子性

服务耦合度

服务间无逻辑依赖

服务间需严格协调执行顺序

幂等性

依赖数据库唯一约束

需主动拦截重复请求

总的来说:单个数据源用悲观锁足以,多个数据源(数据库)要用分布式锁

相关文章
|
SQL 关系型数据库 MySQL
|
7月前
|
缓存 安全 测试技术
GO项目开发规范文档解读
本篇博客的目的,更多是为快速翻阅与回忆使用。
349 1
|
12月前
|
JavaScript 前端开发 物联网
Node.js
Node.js:将JavaScript从浏览器带入服务端的革命性运行时,凭借事件驱动、非阻塞I/O模型,重塑高性能服务器开发。它打破全栈壁垒,催生庞大生态,推动实时应用与微服务发展,成为连接过去与未来的技术桥梁。(238字)
970 137
|
12月前
|
存储 弹性计算 监控
如何实现配置跨区域复制?
超68%企业因无异地容灾致数据丢失。阿里云跨区域复制功能,实现数据双活、合规存储与低延迟访问。本文详解OSS与ECS跨区域配置步骤,助力企业构建高可用架构。
|
人工智能 监控 安全
云端问道18期实践教学-AI 浪潮下的数据安全管理实践
本文主要介绍AI浪潮下的数据安全管理实践,主要分为背景介绍、Access Point、Bucket三个部分
808 54
|
10月前
|
安全 小程序 JavaScript
OAuth2.0四种授权模式
OAuth2四种授权模式简介:授权码模式最安全,适用于第三方登录;简化模式适用于无后端的应用;密码模式需高度信任;客户端模式用于服务间调用,无需用户参与。
|
10月前
|
传感器 网络协议 编译器
C 语言为何能稳居底层开发主流语言宝座
自1972年诞生以来,C语言凭借极致性能、直接操控硬件的能力及完善的生态,在嵌入式系统、操作系统等底层开发领域始终占据核心地位,成为近半个世纪不可替代的编程基石。
|
JSON 前端开发 JavaScript
借助 CodeBuddy,我见证了一款在线代码格式化神器的诞生
借助 CodeBuddy,我见证了一款在线代码格式化神器的诞生
490 13
|
机器学习/深度学习 编解码 监控
近红外和可见光图像融合的ICA变换
近红外(NIR)与可见光图像融合中应用独立成分分析(ICA)变换,是一种基于统计独立特性的图像融合方法,旨在结合可见光图像的纹理细节与近红外图像的光谱 / 辐射信息(如低光照、穿透能力等)。
427 5
|
传感器 人工智能 物联网
智能鞋:从脚下开始的科技革命
智能鞋:从脚下开始的科技革命
1504 6

热门文章

最新文章