面试题答案
一键面试核心原理
- 静态初始化延迟:
lazy_static
库利用Rust的OnceCell
机制来实现惰性求值。OnceCell
是Rust标准库中提供的一种类型,它可以确保内部值只被初始化一次。lazy_static
库基于OnceCell
构建,将全局变量的初始化推迟到首次访问该变量时。 - 线程安全:
lazy_static
库创建的惰性求值全局变量是线程安全的。它通过Once
类型来实现这一点,Once
类型保证其关联的代码块只会被执行一次,无论有多少个线程尝试访问。在多线程环境下,Once
类型会协调各个线程,确保初始化代码块只被执行一次,并且后续线程可以安全地获取已经初始化的值。
示例
- 添加依赖:在
Cargo.toml
文件中添加lazy_static
依赖:
[dependencies]
lazy_static = "1.4.0"
- 使用示例:
use lazy_static::lazy_static;
lazy_static! {
static ref GLOBAL_VARIABLE: i32 = {
println!("Initializing GLOBAL_VARIABLE");
42
};
}
fn main() {
println!("Value of GLOBAL_VARIABLE: {}", *GLOBAL_VARIABLE);
println!("Value of GLOBAL_VARIABLE again: {}", *GLOBAL_VARIABLE);
}
在上述代码中,lazy_static!
宏定义了一个惰性求值的全局变量GLOBAL_VARIABLE
。当第一次访问GLOBAL_VARIABLE
时,会执行大括号内的初始化代码块,打印Initializing GLOBAL_VARIABLE
并赋值为42
。后续访问GLOBAL_VARIABLE
时,不会再次执行初始化代码块。