Rc = reference counted, NOT thread-safe, uses non-atomic ops. Arc = atomic reference counted, thread-safe, uses atomic ops. Same concept, different thread-safety level.
Rc — fast, single-thread only:
1use std::rc::Rc;23let data = Rc::new(42);4let ref1 = Rc::clone(&data);5let ref2 = Rc::clone(&data);6println!("{}", *ref1 + *ref2); // 84
Arc — safe, multi-threaded:
1use std::sync::Arc;2use std::thread;34let data = Arc::new(vec![1, 2, 3]);5let mut handles = vec![];67for i in 0..3 {8 let d = Arc::clone(&data);9 handles.push(thread::spawn(move || {10 println!("Thread {}: sum={}", i, d.iter().sum::<i32>());11 }));12}1314for h in handles { h.join().unwrap(); }
When to use Rc:
When to use Arc:
Common mistakes: