面试题答案
一键面试- 利用
Mutex
实现线程安全:Mutex
(互斥锁)提供了独占访问的机制,同一时间只有一个线程可以获取锁并访问数据。这对于读 - 写操作都适用,但如果读操作频繁,会导致性能瓶颈,因为每次读都要独占锁。- 关键代码片段:
use std::sync::{Arc, Mutex};
// 假设的复杂数据结构
#[derive(Debug)]
struct TreeNode {
value: i32,
children: Vec<Arc<Mutex<TreeNode>>>,
}
fn main() {
let root = Arc::new(Mutex::new(TreeNode {
value: 0,
children: Vec::new(),
}));
let child = Arc::new(Mutex::new(TreeNode {
value: 1,
children: Vec::new(),
}));
{
let mut root_guard = root.lock().unwrap();
root_guard.children.push(child.clone());
}
let child_value = child.lock().unwrap().value;
println!("Child value: {}", child_value);
}
- 利用
RwLock
实现线程安全:RwLock
(读写锁)允许多个线程同时进行读操作,只有在写操作时才独占锁。这在读取操作远多于写操作的场景下能显著提升性能。- 关键代码片段:
use std::sync::{Arc, RwLock};
// 假设的复杂数据结构
#[derive(Debug)]
struct TreeNode {
value: i32,
children: Vec<Arc<RwLock<TreeNode>>>,
}
fn main() {
let root = Arc::new(RwLock::new(TreeNode {
value: 0,
children: Vec::new(),
}));
let child = Arc::new(RwLock::new(TreeNode {
value: 1,
children: Vec::new(),
}));
{
let mut root_guard = root.write().unwrap();
root_guard.children.push(child.clone());
}
let child_value = child.read().unwrap().value;
println!("Child value: {}", child_value);
}
在实际应用中,如果读操作频繁,优先考虑RwLock
;如果读写操作频率相近或者写操作频繁,Mutex
可能是更合适的选择。同时,要注意锁的粒度,避免不必要的性能开销。