Expanding on Edward's answers:
1. Making all methods synchronized is a common strategy for making thread-safe classes, but (a) making all methods synchronized does not necessarily guarantee
thread safety, and (b) it's also possible to make thread-safe classes that do not use synchronization at all, and instead use other techniques (such as the classes in java.util.concurrent).
2.
Sometimes, in poorly-designed not-really-thread-safe classes like java.util.Vector and its evil twin Collections.synchronizedlist(), you may need additional synchronization for some sequences of method calls, to prevent other threads from cutting in between method calls. For such classes, I believe the original synchronization of each method was largely useless and misleading. If I need to use a List in a thread-safe manner I will probably use a simple ArrayList and do all synchronization externally. Using Vector or Collections.synchronizedList() has a bad tendency to make people think they're safe, when they're really not.
3. That's a very very general question, and without knowing how much you already understand about the subject, it's best answered by a tutorial, as Edward suggested.