An async fork of double-checked-cell, a thread-safe lazily initialized cell using double-checked locking.
Provides a memory location that can be safely shared between threads and initialized at most once. Once the cell is initialized it becomes immutable.
If you do not need to change the value after initialization
DoubleCheckedCell<T> is more efficient than a Mutex<Option<T>>.
use double_checked_cell::DoubleCheckedCell;
use futures::future::ready;
let cell = DoubleCheckedCell::new();
// The cell starts uninitialized.
assert_eq!(cell.get().await, None);
// Perform potentially expensive initialization.
let value = cell.get_or_init(async { 21 + 21 }).await;
assert_eq!(*value, 42);
assert_eq!(cell.get().await, Some(&42));
// The cell is already initialized.
let value = cell.get_or_init(async { unreachable!() }).await;
assert_eq!(*value, 42);
assert_eq!(cell.get().await, Some(&42));- once_cell - Provides a superset of this crate's functionality, with a nicely consistent API.
These crates are similar but distinct by design:
- lazy-init – Based on a
LazyTransform<T, U>which can lazily consumeTto produce anU. Therefore cannot support fallible initialization. - lazycell –
AtomicLazyCelldoes not support lazy initialization (unlike its non-thread-safe counterpartLazyCellusingLazyCell::borrow_with()). - mitochondria – Not
Sync. - lazy_static - With the optional (currently nightly only)
const_fnfeature,DoubleCheckedCell::new()can also be used in static/const context. Howeverlazy_static!is more convenient when there is only a single way to initialize the cell.
- 2.0.2
- Update to parking_lot 0.9.
- 2.0.1
- Update to parking_lot 0.7.
- 2.0.0
- Changed unwinding behavior:
DoubleCheckedCellno longer implements poisoning. - New optional cargo features:
parking_lot_mutex,const_fn.
- Changed unwinding behavior:
- 1.1.0
- Fix unsoundness:
DoubleCheckedCell<T>whereT: !Sendcannot beSync.
- Fix unsoundness:
- 1.0.1
- Ignore
unused_unsafewarning due toUnsafeCell::into_inner()no longer beeing unsafe.
- Ignore
- 1.0.0
- Initial release.
double-checked-cell is licensed under the Apache 2.0 and MIT license, at your option.