Static methods have some issues with flexibility. When you say SomeClass.method() you're committed to SomeClass. We can't easily slip you a subclass or another implementation of an interface for custom behavior. If you say
then the factory can return a list manager for databases or one for XML web services, or one for flat files, or one that works all in memory for
unit testing.
And, yes, static methods that use static variables can have
thread issues. If they only use local variables they can be made safe ... or not.
Performance is generally not a consideration in deciding when to use static methods. Other design factors, like the flexibility shown above, are much more important.
Hope that helps!