diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp
index 62988cdc644ae67528debf91b2b44f1cbf1e62bd..6b5feaf1c46a0553cab0e65f6a9ef6672fc54bde 100644
--- a/indra/llcommon/llsingleton.cpp
+++ b/indra/llcommon/llsingleton.cpp
@@ -34,5 +34,5 @@
 
 #include "llsingleton.h"
 
-std::map<std::string, void *> LLSingletonRegistry::sSingletonMap;
+std::map<std::string, void *> * LLSingletonRegistry::sSingletonMap = NULL;
 
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index 00c87821c2449e251ed47fbdc50acdd04bf33231..f55fafadd8dff8ea44e9b41eec191d86879a9053 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -42,19 +42,30 @@
 class LL_COMMON_API LLSingletonRegistry {
 	private:
 		typedef std::map<std::string, void *> TypeMap;
-		static TypeMap sSingletonMap;
+		static TypeMap * sSingletonMap;
+
+		static void checkInit()
+		{
+			if(sSingletonMap == NULL)
+			{
+				sSingletonMap = new TypeMap();
+			}
+		}
 
 	public:
 		template<typename T> static void * & get()
 		{
 			std::string name(typeid(T).name());
 
-			if(0 == sSingletonMap.count(name))
-			{
-				sSingletonMap[name] = NULL;
-			}
+			checkInit();
+
+			// the first entry of the pair returned by insert will be either the existing
+			// iterator matching our key, or the newly inserted NULL initialized entry
+			// see "Insert element" in http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html
+			TypeMap::iterator result =
+				sSingletonMap->insert(std::make_pair(name, (void*)NULL)).first;
 
-			return sSingletonMap[typeid(T).name()];
+			return result->second;
 		}
 };
 
@@ -130,12 +141,13 @@ class LLSingleton : private boost::noncopyable
 
 	static SingletonInstanceData& getData()
 	{
-		void * & registry = LLSingletonRegistry::get<DERIVED_TYPE>();
-		static SingletonInstanceData data;
+		// this is static to cache the lookup results
+		static void * & registry = LLSingletonRegistry::get<DERIVED_TYPE>();
 
 		// *TODO - look into making this threadsafe
 		if(NULL == registry)
 		{
+			static SingletonInstanceData data;
 			registry = &data;
 		}