Singleton implementation using generics
About your locking strategy to create the singleton, I would use a double check to avoid too much locking:

if(x)
{
    lock(Locker)
        if(x) //again once we got the lock
            DoStuff();
} 
else 
{
    FooBar();
}


Like this, you will hopefully use the lock only once when you first call the instance.