Java allows multithreading which means multiple tasks can run concurrently within a single program. A thread goes through different states in its lifecycle from being born to running to termination. Threads can be created by implementing the Runnable interface and overriding the run method. The run method contains the task being performed by the thread. Synchronization is needed when multiple threads access shared resources to prevent race conditions and ensure only one thread accesses the resource at a time.