最近在使用 Rust 重写一些老项目时,经常会碰到 Arc、RwLock、Mutex 以及 RefCell 这些类型。它们都和“共享”或“可变”有关,这里简单整理一下它们的区别和常见使用场景。
前言
假设现在设计一个在线用户管理模块,并且需要支持通过编号获取对应的用户实例,看起来这个需求不复杂,但如果再往前走一步,就会发现后面很快会碰到共享所有权和内部状态修改的问题。
先看一个最简单的版本:
1 | pub struct User { |
一开始这样写没什么问题,UserMgr 负责保存用户,通过 id 取出来就行了。