A multithreaded program involves multiple threads of control in a single program. Each thread has its own stack. Other resources of the process are shared by all threads and while trying to access them it should be synchronized.
Importance of thread synchronization:
Avoids issues like deadlocks and starvation
Can be used for de bugging multi threaded programs