1/6

Arc<T> is Rc<T> with an atomic reference count. That single difference is what makes it Send + Sync (when T is), and it is the standard way to hand the same data to several threads.

let table = Arc::new(big_vec);
for chunk in 0..4 {
    let table = Arc::clone(&table);      // one atomic increment
    thread::spawn(move || { /* reads table */ });
}

The shadowing let table = Arc::clone(&table); inside the loop is the idiom: it clones the handle for this iteration, and the move closure takes that clone rather than the outer binding.