* using ThreadLocal to make sure different threads won't share the same
containers
* Applying lazy initialization, it's unnecessary to call Init() explicitly
anymore