面试题答案
一键面试const声明变量注意点
- 常量特性:
const
声明的常量是编译期确定的值,它的类型必须是Copy
类型(因为其值在编译期确定,无法在运行时动态变化)。 - 跨线程访问:由于常量在编译期就确定,且存储在只读数据段,所以可以安全地跨线程访问,无需额外的线程安全措施。
示例代码:
const MY_CONST: i32 = 42;
fn main() {
std::thread::spawn(|| {
println!("Thread accessing const: {}", MY_CONST);
}).join().unwrap();
println!("Main thread accessing const: {}", MY_CONST);
}
static声明变量注意点
- 静态变量特性:
static
声明的静态变量在程序整个生命周期存在,存储在静态存储区。它可以是任何'static
生命周期的类型,不一定是Copy
类型。 - 跨线程访问:默认情况下,
static
变量不是线程安全的。如果要跨线程访问,需要使用线程安全的类型包裹,如Mutex
、RwLock
等。
示例代码(使用Mutex
保证线程安全):
use std::sync::{Mutex, Arc};
static mut MY_STATIC: i32 = 0;
fn main() {
let shared_static = Arc::new(Mutex::new(MY_STATIC));
let handles = (0..10).map(|_| {
let shared_static = shared_static.clone();
std::thread::spawn(move || {
let mut data = shared_static.lock().unwrap();
*data += 1;
println!("Thread incremented static: {}", *data);
})
}).collect::<Vec<_>>();
for handle in handles {
handle.join().unwrap();
}
let data = shared_static.lock().unwrap();
println!("Final value of static: {}", *data);
}
总结:const
常量由于编译期确定且只读,可直接跨线程安全访问;static
静态变量若要跨线程访问,需使用线程安全类型包裹以保证线程安全。