private PooledObject <T> Create()
        {
            int  localMaxTotal  = MaxTotal;
            long newCreateCount = Interlocked.Increment(ref createCount);

            if (localMaxTotal > -1 && newCreateCount > localMaxTotal || newCreateCount > Int32.MaxValue)
            {
                Interlocked.Decrement(ref createCount);
                return(null);
            }

            T t = null;

            try
            {
                t = factory.CreateObject();
            }
            catch
            {
                Interlocked.Decrement(ref createCount);
                throw;
            }

            PooledObject <T> p = new PooledObject <T>(t);

            allObjects[t] = p;

            return(p);
        }