面试题答案
一键面试1. lazy_static库保证多线程惰性求值正确性和线程安全性的原理
- 惰性求值:lazy_static库使用了内部的
OnceCell
机制。OnceCell
只有在首次调用get
方法访问值时才会初始化,实现了惰性求值。 - 线程安全性:通过
Once
类型来保证线程安全。Once
类型使用操作系统的原子操作和锁机制,确保只有一个线程能初始化值。一旦初始化完成,所有线程都能安全地读取这个值,因为后续的读取操作是无锁的。
2. 具体实现代码
use lazy_static::lazy_static;
use std::sync::Mutex;
// 定义缓存结构
struct Cache {
data: Vec<i32>,
}
// 使用lazy_static定义全局线程安全缓存
lazy_static! {
static ref CACHE: Mutex<Cache> = Mutex::new(Cache { data: vec![1, 2, 3] });
}
fn main() {
// 访问缓存
let cache = CACHE.lock().unwrap();
println!("Cache data: {:?}", cache.data);
}
在上述代码中:
- 首先定义了一个
Cache
结构体,用于表示缓存数据。 - 然后使用
lazy_static!
宏定义了一个全局的、线程安全的CACHE
。这里Mutex
用于保护Cache
实例,确保在多线程环境下对其访问的线程安全性。 - 在
main
函数中,通过CACHE.lock().unwrap()
获取锁从而安全地访问缓存数据。