Rust 中 `.lock()` 的作用 最后更新时间:2025年10月24日 ## Rust 中 `.lock()` 的作用 `.lock()` 是用于获取互斥锁(Mutex)的方法,在并发编程中起关键作用。 ### 主要功能 1. **线程同步**:确保同一时间只有一个线程可以访问被保护的数据 2. **数据安全**:防止多个线程同时修改共享数据导致的竞争条件 3. **内存安全**:保证在多线程环境下的内存访问安全 ### 工作原理 ```rust // Mutex 的基本使用模式 use std::sync::Mutex; let data = Mutex::new(vec![1, 2, 3]); { let mut guard = data.lock().unwrap(); // 获取锁 guard.push(4); // 修改数据 // guard 离开作用域时自动释放锁 } ``` ### 在代码中 ```rust let conn = data.db.conn.lock().unwrap(); ``` 这行代码的作用是: 1. `data.db.conn` 是一个 `Mutex` 类型的数据库连接池 2. `.lock()` 尝试获取互斥锁 3. 如果获取成功,返回一个 `MutexGuard` 4. 如果获取失败(极少见的情况),`unwrap()` 会 panic ### 为什么需要锁 在 Web 应用中,多个请求可能同时访问数据库连接: ```rust // 多个并发请求可能同时执行 async fn request1() { let conn = data.db.conn.lock().unwrap(); // 请求1获取锁 // 执行数据库操作... } // 锁在这里释放 async fn request2() { let conn = data.db.conn.lock().unwrap(); // 请求2等待锁释放后才能获取 // 执行数据库操作... } ``` ### Python 中的类似概念 Python 中的 `threading.Lock` 提供类似功能: ```python import threading # 共享资源保护 shared_data = [] data_lock = threading.Lock() def access_shared_data(): with data_lock: # 获取锁 shared_data.append(42) # 操作共享数据 # 离开 with 块时自动释放锁 # 或者手动获取/释放锁 def manual_lock_access(): data_lock.acquire() try: shared_data.append(42) finally: data_lock.release() # 必须手动释放 ``` ### Rust vs Python 的区别 | 特性 | Rust Mutex | Python Lock | |------|------------|-------------| | 编译时检查 | 有,所有权系统保证正确使用 | 无,依赖运行时检查 | | 自动释放 | RAII,guard 离开作用域自动释放 | 需要手动释放或使用 with 语句 | | 错误处理 | Result 类型,必须处理获取锁失败 | 可能死锁,需要手动处理 | | 性能 | 零成本抽象 | 有一定运行时开销 | ### 在你的应用中的意义 由于 Actix-web 是异步框架,多个请求可能并发访问数据库连接池,使用 `Mutex` 确保了: 1. 同一时间只有一个请求可以使用数据库连接 2. 防止数据库连接竞争导致的问题 3. 保证数据一致性
Comments | NOTHING