Avoid it. Introduce synchronization only when necessary.
Isolate it. Cluster synchronization needs into a single-responsibility class that does as little as possible. Ensure that as few clients as possible interact with a synchronized class. Ensure that as few methods as possible interact with shared data.
Shared, or "server," classes should provide synchronization instead of depending on clients to synchronize properly.
If a server class has not provided synchronization, consider writing a "wrapper" class that adds synchronization and delegates all messages to the server class.
Use the synchronization class library located in java.util.concurrent.