pub fn new(t: T) -> (Self, Self) {
        let arc = Arc::new(Inner {
            state: AtomicPtr::new(ptr::null_mut()),
            value: Some(UnsafeCell::new(t)),
        });

        (Self { arc: arc.clone() }, Self { arc })
    }
Creates a new `BiLock` protecting the provided data.

Two handles to the lock are returned, and these are the only two handles
that will ever be available to the lock. These can then be sent to separate
tasks to be managed there.

The data behind the bilock is considered to be pinned, which allows `Pin`
references to locked data. However, this means that the locked value
will only be available through `Pin<&mut T>` (not `&mut T`) unless `T` is `Unpin`.
Similarly, reuniting the lock and extracting the inner value is only
possible when `T` is `Unpin`.
futures-util/src/lock/bilock.rs