Despite claims by competing technologies, locks remain the best choice for implementing synchronization and protecting critical sections of your code.
When adding parallelism, the key design choice is to express concurrency in an application without explicitly managing the scheduling of that concurrency onto the hardware.