mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
![]() Explain differences between `{Once,Lazy}{Cell,Lock}` types The question of "which once-ish cell-ish type should I use?" has been raised multiple times, and is especially important now that we have stabilized the `LazyCell` and `LazyLock` types. The answer for the `Lazy*` types is that you would be better off using them if you want to use what is by far the most common pattern: initialize it with a single nullary function that you would call at every `get_or_init` site. For everything else there's the `Once*` types. "For everything else" is a somewhat weak motivation, as it only describes by negation. While contrasting them is inevitable, I feel positive motivations are more understandable. For this, I now offer a distinct example that helps explain why `OnceLock` can be useful, despite `LazyLock` existing: you can do some cool stuff with it that `LazyLock` simply can't support due to its mere definition. The pair of `std::sync::*Lock`s are usable inside a `static`, and can serve roles in async or multithreaded (or asynchronously multithreaded) programs that `*Cell`s cannot. Because of this, they received most of my attention. Fixes #124696 Fixes #125615 |
||
---|---|---|
.. | ||
barrier | ||
condvar | ||
lazy_lock | ||
mpmc | ||
mpsc | ||
mutex | ||
once | ||
once_lock | ||
reentrant_lock | ||
rwlock | ||
barrier.rs | ||
condvar.rs | ||
lazy_lock.rs | ||
mod.rs | ||
mutex.rs | ||
once_lock.rs | ||
once.rs | ||
poison.rs | ||
reentrant_lock.rs | ||
rwlock.rs |