Describe the differences between multi-threading and single-threading. How does Java manage thread synchronization?