内部可变性
很多时候,类型值需要在拥有多个别名的情况下进行改变。在 Rust 中,这可以通过一种称为 内部可变性 模式来实现。 如果某一个类型值的内部状态,可以通过对其 共享引用 进行改变,那么该类型值就具有内部可变性。 这与强调安全的 要求 不一致,通常希望共享引用所指向的值不会被改变。
std::cell::UnsafeCell<T>
类型是禁用这个限制的唯一方法。
当 UnsafeCell<T>
类型被不可变地别名化时,仍然可以安全地对其所包含的 T
进行改变或获取可变引用。
该类型与所有其他类型一样,当拥有多个 &mut UnsafeCell<T>
别名时,是未定义的行为。
通过将 UnsafeCell<T>
用作字段,可以创建其他具有内部可变性的类型。
标准库提供了各种类型,以提供安全的内部可变性 API 。
比如, std::cell::RefCell<T>
是常规规则,使用运行时借用检查来确保多个引用安全延伸。
std::sync::atomic
模块的相关类型,包装了只能通过原子操作来访问的值,允许其值在线程之间共享和改变。