Synchronization primitives provide the most basic and essential form of communication between tasks. They protect resources, synchronize work and trigger actions.
As a developer, I want that a single resource can only access from one task at a time, so that I can share resources between tasks without data hazards.