直接回答:Rust 默认"可变性跟随绑定"(let mut),但共享引用 &T 语义上不可变。内部可变性类型在 &self 方法里也能改内部值,靠把借用检查从编译期移到运行期(或用 unsafe 封装并自担正确性)。Cell 适合 Copy 小类型,整体取出替换;RefCell 支持任意类型,运行期跟踪借用计数,违反规则 panic;Mutex/RwLock 用锁实现跨线程共享可变,违反规则的代价是阻塞或死锁。
展开解析:单线程选 Cell/RefCell:零锁开销,但 borrow 规则运行期才检查——borrow_mut 期间再 borrow 直接 panic,迭代中修改容器是经典踩坑。跨线程必须 Mutex/Arc 组合:Arc<Mutex<T>> 是共享可变状态的标准拼法。还有一组易混淆的原子类型 AtomicUsize 等,本质也是内部可变性,适合计数器等简单共享。选型决策:数据是 Copy 小类型→Cell;单线程复杂结构→RefCell;跨线程→Mutex 或原子。记住 RefCell 不 Sync,传不过线程边界,编译器会拦着你,这正是类型系统在保护你。
追问方向:RefCell 的 borrow 规则与编译期借用规则如何对应?Mutex 中毒(poisoning)是什么?OnceCell/LazyLock 解决什么场景?
(约 430 字)