- Use collections from the java.util.concurrent package with a focus on the advantages over and differences from the traditional java.util collections
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility
- Use Lock, ReadWriteLock, and ReentrantLock classes in the java.util.concurrent.locks and java.util.concurrent.atomic packages to support lock-free thread-safe programming on single variables
- Use Executor, ExecutorService, Executors, Callable, and Future to execute tasks using thread pools
- Use the parallel Fork/Join Framework