结论:Rc<T>/RefCell<T> 是单线程的共享所有权与内部可变性方案:非原子计数、无同步,零锁开销但跨线程即编译错误;Arc<T>/Mutex<T> 是对应的多线程版本:原子计数加互斥锁保证线程安全,代价是原子操作与锁竞争开销。选型:单线程用 Rc<RefCell<T>>,跨线程共享用 Arc<Mutex<T>>

展开:Rc 提供共享所有权(clone 只加计数),RefCell 把借用检查移到运行时(borrow()/borrow_mut() 冲突会 panic);Arc 用原子引用计数,Mutex::lock() 返回守卫,守卫 drop 即解锁,且 Mutex 能给 T: Send 的类型赋予 Sync。易错点:①多线程切勿用 Rc<RefCell>(编译器也会阻止);②lock() 返回 Result 处理锁中毒(持锁线程 panic 后);③Arc 循环引用会泄漏、Mutex 顺序不当会死锁,类型系统防不住;④读多写少考虑 RwLock。追问方向:为什么 Mutex<T> 只要求 T: Send 就能 Sync?锁保证任意时刻只有一个线程能访问内部数据,共享因此安全。

use std::sync::{Arc, Mutex};
let counter = Arc::new(Mutex::new(0));
let mut hs = vec![];
for _ in 0..4 {
    let c = Arc::clone(&counter);
    hs.push(std::thread::spawn(move || *c.lock().unwrap() += 1));
}
for h in hs { h.join().unwrap(); }
assert_eq!(*counter.lock().unwrap(), 4);