Synchronization is used in multithreaded programming to prevent race conditions when multiple threads access shared resources. It is implemented using monitors in Java - only one thread can own a monitor at a time. The synchronized keyword is used to synchronize methods and blocks of code so only one thread can execute that code at a time. Daemon threads are low priority background threads that do not prevent the JVM from terminating when only daemon threads are running. Thread groups allow grouping of threads to manipulate them collectively.