面试题答案
一键面试设计思路
- Rc:
Rc
用于实现多个对象对共享数据的引用,它通过引用计数来管理数据的生命周期。当引用计数为0时,数据会被自动释放。 - RefCell:
RefCell
用于在运行时检查借用规则,允许内部可变性。由于它是在运行时检查借用,而不是编译时,所以可以在多个对象间实现可变借用。 - 性能优化:为了减少锁争用,尽量避免在高并发场景下频繁借用
RefCell
。可以将一些不需要修改共享数据的操作放在Rc
引用上直接执行,只有在需要修改数据时才借用RefCell
。
核心代码示例
use std::cell::RefCell;
use std::rc::Rc;
// 定义共享数据的结构体
struct SharedData {
value: i32,
}
// 定义持有共享数据引用的结构体
struct Object {
data: Rc<RefCell<SharedData>>,
}
impl Object {
fn new(data: Rc<RefCell<SharedData>>) -> Self {
Object { data }
}
fn get_and_modify(&self) {
// 获取可变引用,这里会在运行时检查借用规则
let mut shared_data = self.data.borrow_mut();
shared_data.value += 1;
println!("Modified value: {}", shared_data.value);
}
}
fn main() {
// 创建共享数据
let shared_data = Rc::new(RefCell::new(SharedData { value: 0 }));
// 创建多个对象共享这个数据
let object1 = Object::new(Rc::clone(&shared_data));
let object2 = Object::new(Rc::clone(&shared_data));
// 多个对象获取并修改共享数据
object1.get_and_modify();
object2.get_and_modify();
}
在这个示例中,SharedData
是被多个 Object
共享的数据。Object
结构体持有 Rc<RefCell<SharedData>>
类型的引用。get_and_modify
方法通过 borrow_mut
获取 SharedData
的可变引用,从而修改其内部数据。Rc
确保数据在所有引用都消失时被释放,RefCell
则提供了内部可变性,同时在运行时检查借用规则,以避免数据竞争。