Rc = reference counted, NOT thread-safe, non-atomic. Arc = atomic reference counted, thread-safe, atomic operations. Same shared-ownership concept, different thread-safety levels.
Rc — fast, single-thread:
1use std::rc::Rc;23let shared = Rc::new(String::from("cached"));4let a = Rc::clone(&shared);5let b = Rc::clone(&shared);6println!("{} {} {}", *shared, *a, *b); // cached cached cached7println!("Count: {}", Rc::strong_count(&shared)); // 3
Arc — safe, multi-thread:
1use std::sync::Arc;2use std::thread;34let data = Arc::new(vec![1, 2, 3, 4, 5]);5let mut handles = vec![];67for i in 0..3 {8 let d = Arc::clone(&data);9 handles.push(thread::spawn(move || {10 let sum: i32 = d.iter().sum();11 println!("Thread {}: sum={}", i, sum);12 }));13}14for h in handles { h.join().unwrap(); }
When to use Rc:
When to use Arc:
Common mistakes: