Функция new класса Once
Функция new класса Once создаёт новый экземпляр примитива
Once. Класс Once представляет собой примитив синхронизации,
который гарантирует, что некоторая инициализация будет выполнена ровно
один раз, даже если к ней одновременно обращаются несколько потоков.
Функция не принимает параметров и возвращает значение типа Once.
Созданный экземпляр доступен для использования в статических переменных
и в многопоточном контексте.
Синтаксис
Once::new()
Пример
Давайте создадим экземпляр Once и выполним инициализацию
через метод call_once:
use std::sync::Once;
static INIT: Once = Once::new();
fn main()
{
INIT.call_once(|| {
println!("initialized");
});
INIT.call_once(|| {
println!("this will not be printed");
});
}
Результат выполнения кода:
initialized
Пример
Давайте создадим локальную переменную типа Once и проверим,
что инициализация выполняется только один раз:
use std::sync::Once;
fn main()
{
let once = Once::new();
let mut counter = 0;
once.call_once(|| {
counter += 1;
});
once.call_once(|| {
counter += 1;
});
println!("{}", counter);
}
Результат выполнения кода:
1
Пример
Давайте используем Once в многопоточном приложении,
чтобы гарантировать однократную инициализацию общего ресурса:
use std::sync::{Arc, Once};
use std::thread;
fn main()
{
let once = Arc::new(Once::new());
let mut handles = vec![];
for i in 0..5 {
let once = Arc::clone(&once);
let handle = thread::spawn(move || {
once.call_once(|| {
println!("init from thread {}", i);
});
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
Возможный результат выполнения кода:
init from thread 0
Смотрите также
-
класс
Once,
который представляет примитив однократного выполнения -
метод
call_once,
который выполняет замыкание ровно один раз -
класс
OnceLock,
который хранит значение, инициализируемое однократно -
метод
get_or_init,
который возвращает значение, инициализируя его при необходимости