Rust 中 .lock() 的作用
.lock() 是用于获取互斥锁(Mutex)的方法,在并发编程中起关键作用。
主要功能
- 线程同步:确保同一时间只有一个线程可以访问被保护的数据
- 数据安全:防止多个线程同时修改共享数据导致的竞争条件
- 内存安全:保证在多线程环境下的内存访问安全
工作原理
// Mutex<T> 的基本使用模式
use std::sync::Mutex;
let data = Mutex::new(vec![1, 2, 3]);
{
let mut guard = data.lock().unwrap(); // 获取锁
guard.push(4); // 修改数据
// guard 离开作用域时自动释放锁
}在代码中
let conn = data.db.conn.lock().unwrap();这行代码的作用是:
data.db.conn是一个Mutex<T>类型的数据库连接池.lock()尝试获取互斥锁- 如果获取成功,返回一个
MutexGuard - 如果获取失败(极少见的情况),
unwrap()会 panic
为什么需要锁
在 Web 应用中,多个请求可能同时访问数据库连接:
// 多个并发请求可能同时执行
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 提供类似功能:
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 确保了:
- 同一时间只有一个请求可以使用数据库连接
- 防止数据库连接竞争导致的问题
- 保证数据一致性


Comments | NOTHING