你刚才提到的 Arc<...> 和 Weak<...> 是什么东西?
eeeeeeeeeeeeeee
Arc<T> 和 Weak<T> 是 Rust 标准库中的引用计数智能指针类型,用于多线程共享所有权的数据,属于 std::sync 模块。它们广泛用于构建关系型对象模型(如主外键)、缓存引用、图结构等场景,尤其适合你目前这种对象间存在引用/关联的场景。
🧱 Arc<T>(Atomic Reference Counted)
- 全称:原子引用计数智能指针。
- 多线程安全的
Rc<T>(单线程引用计数)。 - 多个线程可以拥有同一份数据的共享所有权。
示例:
use std::sync::Arc;
let a = Arc::new(String::from("hello"));
let a1 = Arc::clone(&a); // 引用计数 +1
let a2 = Arc::clone(&a); // 引用计数 +1
println!("{}", a1);
println!("{}", a2); // 数据只存在一份
🕳️ Weak<T>(非拥有型弱引用)
- 不增加引用计数(即不会阻止内存释放)。
- 用于打破循环引用(典型的:对象 A 引用对象 B,B 又引用 A)。
- 需要
upgrade()才能访问实际数据(返回Option<Arc<T>>)。
示例:
use std::sync::{Arc, Weak};
let strong = Arc::new(String::from("hello"));
let weak: Weak<String> = Arc::downgrade(&strong); // 弱引用
assert!(weak.upgrade().is_some()); // 返回 Some(Arc<T>)
drop(strong); // 强引用全部被释放
assert!(weak.upgrade().is_none()); // 数据已被回收
🧩 适用于你的场景:
你提到对象之间存在主外键、关联关系:
- 使用
Arc<T>存储对象本体,供多个地方共享引用。 - 使用
Weak<T>存储指向父对象或外键对象的引用,避免循环引用和内存泄漏。
举个例子:成员与维度
use std::sync::{Arc, Weak};
struct Dimension {
gid: u64,
name: String,
}
struct Member {
gid: u64,
name: String,
dimension: Weak<Dimension>, // 不拥有维度,只是关联
}
// 构建示例数据
let dim = Arc::new(Dimension { gid: 1, name: "地区".to_string() });
let member = Member {
gid: 100,
name: "北京".to_string(),
dimension: Arc::downgrade(&dim),
};
总结对比:
| 类型 | 是否线程安全 | 是否共享所有权 | 是否影响生命周期 | 适合场景 |
|---|---|---|---|---|
Arc<T> |
✅ 是 | ✅ 是 | ✅ 会延长生命周期 | 多线程缓存、父子对象持有 |
Weak<T> |
✅ 是 | 🚫 否 | 🚫 不影响生命周期 | 引用但不拥有(如外键、子指向父) |
是否需要我帮你设计一个基于 Arc 和 Weak 构建“对象之间主外键关联关系”的缓存结构模板?
浙公网安备 33010602011771号