Some resources in programming (such as files, data structures, etc) don't handle being accessed at the same time very well.
For example, two threads adding an object to a list at the same time could end up working correctly, dropping one or both of the items, or completely corrupting the state of the list.
In that example, synchronization would be making sure that only one thread is accessing the list at a time, which should prevent any problems from arising.
Most languages provide facilities for synchronization. In Java, for example, there are synchronized blocks and methods and the Lock interface and its implementations.
Thanks
Emily