Implemented instance-per-thread (ThreadSingleton).
Using WeakReferences for singletons so that they can be garbage collected if not used frequently.