结论:数据竞争(data race)是两个线程无同步地并发访问同一内存且至少一个是写,属于未定义行为;竞态条件(race condition)是程序结果依赖线程调度时序的逻辑错误。Rust 的类型系统(Send/Sync + 借用规则)能在编译期彻底杜绝前者,但无法自动防止后者——死锁、时序假设错误仍需设计与测试保证。

展开:Rust 消除数据竞争靠"共享不可变、可变不共享"在并发场景的延伸:要么独占所有权,要么用 Mutex/原子操作建立同步(happens-before)关系。但安全的并发代码仍可能有逻辑错误:两个线程各自正确地拿锁也可能死锁;check-then-act 在两次加锁之间状态已变化;锁粒度不对导致业务数据不一致。易错点:unsafe(如手写 unsafe impl Sync)可绕过检查,此时防护失效、责任回到实现者;原子类型用 Relaxed 序可能造成跨变量逻辑竞态,默认 SeqCst 更稳妥。追问方向:如何发现竞态条件?用 loom 做模型化并发测试、压力测试,以及用 channel/actor 模型收敛共享状态、降低时序敏感度。

use std::sync::mpsc::channel;
let (tx, rx) = channel();
std::thread::spawn(move || tx.send(42).unwrap());
assert_eq!(rx.recv().unwrap(), 42); // channel 语义保证顺序