Synchronization is needed for both software and hardware resources to ensure safe sharing. Hardware resources required for synchronization include semaphores, which help with process synchronization, and interrupt masks, which prevent access to global resources. Software resources like dispatcher objects and spinlocks on multiprocessor systems also require synchronization.