I don't think you need to know the internal details of how a specific TimeZone or a Locale is implemented. As long as you are passing it a TimeZone that is compatible with the Locale, you are good.
Thread starvation occurs when locks are exchanged, not when all threads are waiting for a lock exchange to occur. Think of it this way - starvation is a frequent exchange of locks where some threads do get work done, while deadlock occurs when NO threads get their work done, because they are all waiting.
Tight coupling
still does not exist between the Factory and product classes, because the
factory does not rely on the specific implementation of the product class.
Remember, the factory class only returns an abstract reference. I
understand that some analysts might claim invoking a constructor is part of
tight coupling, but if that is the ONLY thing a class does with another
class, they are not tightly coupled. A tightly coupled class depends
entirely on the implementation of another class.