Sync

收尾本章前,我们再谈 Rust 标准库中另一个关键特质:Sync

Sync 是自动特质 (auto trait),跟 Send 一样。
它会自动为所有可以安全地在线程间共享 (shared) 的类型实现。

换句话说:当 &TSendT 就是 Sync

T: Sync 不蕴含 T: Send (T: Sync doesn't imply T: Send)

要注意 T 可以是 Sync 而不是 Send
例如:MutexGuard 不是 Send,但它是 Sync

它不是 Send,是因为锁必须由获取它的同一个线程释放,因此我们不希望 MutexGuard 在另一个线程上被丢弃。
但它是 Sync,因为把 &MutexGuard 给另一个线程并不影响锁在哪儿被释放。

T: Send 不蕴含 T: Sync (T: Send doesn't imply T: Sync)

反过来也成立:T 可以是 Send 而不是 Sync
例如:RefCell<T>(当 TSend 时)是 Send,但不是 Sync

RefCell<T> 做运行时借用检查,但它用来跟踪借用的计数器不是线程安全的。 因此,多个线程同时持有 &RefCell 会导致数据竞争 (data race),可能多个线程同时拿到对同一数据的可变引用。所以 RefCell 不是 Sync
Send 则没问题,因为把 RefCell 发到另一个线程时不会留下任何指向它内部数据的引用,因此不存在并发可变访问的风险。

原文链接:英文原文