How can the compiler promise no data races? Through two marker traits — Send and Sync — that encode thread-safety into the type system. They're the foundation everything in this track stands on.
Send: safe to move between threads
A type is Send if it's safe to transfer ownership of it to another thread. Most types are. The notable exception is Rc — its non-atomic count would race if two threads cloned it at once, so Rc is not Send, and the compiler refuses to move it into a thread. Arc (atomic) is Send, which is why it's the cross-thread choice.
Sync: safe to share by reference
A type is Sync if &T is safe to share between threads — multiple threads can hold references to it at once. Mutex<T> is Sync (its locking makes concurrent access safe); a plain RefCell is not (its runtime borrow tracking isn't atomic). The compiler checks these automatically.
You rarely write them, but they're always working
You almost never implement Send/Sync by hand — they're automatically derived for types built from other Send/Sync types. But they're why every example in this track compiles only when it's actually safe. When a concurrency mistake won't compile and the error mentions Send or Sync, that's the type system catching a data race before it could ever run.