面试题答案
一键面试use std::sync::{Arc, RwLock};
struct Cache<T> {
data: RwLock<T>,
}
impl<T> Cache<T> {
fn new(data: T) -> Self {
Cache {
data: RwLock::new(data),
}
}
fn read(&self) -> Option<T> {
let guard = self.data.read().ok()?;
Some(guard.clone())
}
fn write(&self, new_data: T) {
let mut guard = self.data.write().ok()?;
*guard = new_data;
}
}
读写锁在此场景中的作用:
- 读锁:当多个线程同时读取缓存数据时,它们可以同时获取读锁。读锁允许多个线程并发读取数据,因为读取操作不会修改数据,所以不会产生数据竞争问题。这大大提高了系统在高并发读场景下的性能。
- 写锁:当有线程需要更新缓存数据时,必须获取写锁。写锁是排他的,即同一时间只有一个线程可以持有写锁。这确保了在更新数据时,没有其他线程可以读取或写入数据,从而保证了数据的一致性和完整性。在写入完成后,写锁被释放,其他线程可以再次获取读锁或写锁。