Rc = reference counted, single-threaded, non-atomic. Arc = atomic reference counted, multi-threaded, atomic. Same shared-ownership pattern, different thread-safety.
Rc — fast, single-thread only:
1use std::rc::Rc;23let config = Rc::new(vec!["opt1", "opt2"]);4let handler = Rc::clone(&config);5println!("Options: {:?}", *handler); // ["opt1", "opt2"]6println!("Count: {}", Rc::strong_count(&config)); // 2
Arc — safe, multi-threaded:
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..4 {8 let d = Arc::clone(&data);9 handles.push(thread::spawn(move || {10 let max = d.iter().max().unwrap();11 println!("Thread {}: max={}", i, max);12 }));13}14for h in handles { h.join().unwrap(); }
When to use Rc:
When to use Arc:
Common mistakes: